1 /* 2 * Copyright (C) 1999 Lars Knoll (knoll (at) kde.org) 3 * (C) 1999 Antti Koivisto (koivisto (at) kde.org) 4 * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2012 Apple Inc. All rights reserved. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Library General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Library General Public License for more details. 15 * 16 * You should have received a copy of the GNU Library General Public License 17 * along with this library; see the file COPYING.LIB. If not, write to 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301, USA. 20 * 21 */ 22 23 #ifndef HTMLPlugInElement_h 24 #define HTMLPlugInElement_h 25 26 #include "bindings/core/v8/SharedPersistent.h" 27 #include "core/html/HTMLFrameOwnerElement.h" 28 #include <v8.h> 29 30 struct NPObject; 31 32 namespace blink { 33 34 class HTMLImageLoader; 35 class RenderEmbeddedObject; 36 class RenderWidget; 37 class Widget; 38 39 enum PreferPlugInsForImagesOption { 40 ShouldPreferPlugInsForImages, 41 ShouldNotPreferPlugInsForImages 42 }; 43 44 class HTMLPlugInElement : public HTMLFrameOwnerElement { 45 public: 46 virtual ~HTMLPlugInElement(); 47 virtual void trace(Visitor*) OVERRIDE; 48 49 void resetInstance(); 50 SharedPersistent<v8::Object>* pluginWrapper(); 51 Widget* pluginWidget() const; 52 NPObject* getNPObject(); 53 bool canProcessDrag() const; 54 const String& url() const { return m_url; } 55 56 // Public for FrameView::addWidgetToUpdate() 57 bool needsWidgetUpdate() const { return m_needsWidgetUpdate; } 58 void setNeedsWidgetUpdate(bool needsWidgetUpdate) { m_needsWidgetUpdate = needsWidgetUpdate; } 59 void updateWidget(); 60 61 bool shouldAccelerate() const; 62 63 void requestPluginCreationWithoutRendererIfPossible(); 64 void createPluginWithoutRenderer(); 65 66 bool usePlaceholderContent() const { return m_usePlaceholderContent; } 67 void setUsePlaceholderContent(bool); 68 69 protected: 70 HTMLPlugInElement(const QualifiedName& tagName, Document&, bool createdByParser, PreferPlugInsForImagesOption); 71 72 // Node functions: 73 virtual void didMoveToNewDocument(Document& oldDocument) OVERRIDE; 74 75 // Element functions: 76 virtual bool isPresentationAttribute(const QualifiedName&) const OVERRIDE; 77 virtual void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStylePropertySet*) OVERRIDE; 78 79 virtual bool hasFallbackContent() const; 80 virtual bool useFallbackContent() const; 81 // Create or update the RenderWidget and return it, triggering layout if 82 // necessary. 83 virtual RenderWidget* renderWidgetForJSBindings() const; 84 85 bool isImageType(); 86 bool shouldPreferPlugInsForImages() const { return m_shouldPreferPlugInsForImages; } 87 RenderEmbeddedObject* renderEmbeddedObject() const; 88 bool allowedToLoadFrameURL(const String& url); 89 bool requestObject(const String& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues); 90 bool shouldUsePlugin(const KURL&, const String& mimeType, bool hasFallback, bool& useFallback); 91 92 void dispatchErrorEvent(); 93 94 String m_serviceType; 95 String m_url; 96 KURL m_loadedUrl; 97 OwnPtrWillBeMember<HTMLImageLoader> m_imageLoader; 98 bool m_isDelayingLoadEvent; 99 100 private: 101 // EventTarget functions: 102 virtual void removeAllEventListeners() OVERRIDE FINAL; 103 104 // Node functions: 105 virtual bool canContainRangeEndPoint() const OVERRIDE { return false; } 106 virtual bool willRespondToMouseClickEvents() OVERRIDE FINAL; 107 virtual void defaultEventHandler(Event*) OVERRIDE FINAL; 108 virtual void attach(const AttachContext& = AttachContext()) OVERRIDE FINAL; 109 virtual void detach(const AttachContext& = AttachContext()) OVERRIDE FINAL; 110 virtual void finishParsingChildren() OVERRIDE FINAL; 111 112 // Element functions: 113 virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; 114 virtual void willRecalcStyle(StyleRecalcChange) OVERRIDE FINAL; 115 virtual bool supportsFocus() const OVERRIDE FINAL { return true; } 116 virtual bool rendererIsFocusable() const OVERRIDE FINAL; 117 virtual bool isKeyboardFocusable() const OVERRIDE FINAL; 118 virtual void didAddUserAgentShadowRoot(ShadowRoot&) OVERRIDE FINAL; 119 virtual void willAddFirstAuthorShadowRoot() OVERRIDE FINAL; 120 121 // HTMLElement function: 122 virtual bool hasCustomFocusLogic() const OVERRIDE; 123 virtual bool isPluginElement() const OVERRIDE FINAL; 124 125 // Return any existing RenderWidget without triggering relayout, or 0 if it 126 // doesn't yet exist. 127 virtual RenderWidget* existingRenderWidget() const = 0; 128 virtual void updateWidgetInternal() = 0; 129 130 bool loadPlugin(const KURL&, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback, bool requireRenderer); 131 bool pluginIsLoadable(const KURL&, const String& mimeType); 132 bool wouldLoadAsNetscapePlugin(const String& url, const String& serviceType); 133 134 mutable RefPtr<SharedPersistent<v8::Object> > m_pluginWrapper; 135 NPObject* m_NPObject; 136 bool m_isCapturingMouseEvents; 137 bool m_needsWidgetUpdate; 138 bool m_shouldPreferPlugInsForImages; 139 bool m_usePlaceholderContent; 140 141 // Normally the Widget is stored in HTMLFrameOwnerElement::m_widget. 142 // However, plugins can persist even when not rendered. In order to 143 // prevent confusing code which may assume that widget() != null 144 // means the frame is active, we save off m_widget here while 145 // the plugin is persisting but not being displayed. 146 RefPtr<Widget> m_persistedPluginWidget; 147 }; 148 149 inline bool isHTMLPlugInElement(const HTMLElement& element) 150 { 151 return element.isPluginElement(); 152 } 153 154 DEFINE_HTMLELEMENT_TYPE_CASTS_WITH_FUNCTION(HTMLPlugInElement); 155 156 } // namespace blink 157 158 #endif // HTMLPlugInElement_h 159