f17ef6e88ed0054b5ae2e75eac15402438aee8bb
[WebKit-https.git] / Source / WebCore / html / HTMLPlugInImageElement.h
1 /*
2  * Copyright (C) 2008, 2009, 2011, 2012, 2014 Apple Inc. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20
21 #ifndef HTMLPlugInImageElement_h
22 #define HTMLPlugInImageElement_h
23
24 #include "HTMLPlugInElement.h"
25
26 namespace WebCore {
27
28 class HTMLImageLoader;
29 class FrameLoader;
30 class Image;
31 class MouseEvent;
32 class RenderStyle;
33 class Widget;
34
35 enum PluginCreationOption {
36     CreateAnyWidgetType,
37     CreateOnlyNonNetscapePlugins,
38 };
39
40 // Base class for HTMLAppletElement, HTMLEmbedElement, and HTMLObjectElement.
41 // FIXME: Should HTMLAppletElement inherit from HTMLPlugInElement directly instead?
42 class HTMLPlugInImageElement : public HTMLPlugInElement {
43 public:
44     virtual ~HTMLPlugInImageElement();
45
46     RenderEmbeddedObject* renderEmbeddedObject() const;
47
48     virtual void setDisplayState(DisplayState) override;
49
50     virtual void updateWidget(PluginCreationOption) = 0;
51
52     const String& serviceType() const { return m_serviceType; }
53     const String& url() const { return m_url; }
54     const URL& loadedUrl() const { return m_loadedUrl; }
55
56     const String loadedMimeType() const
57     {
58         String mimeType = serviceType();
59         if (mimeType.isEmpty())
60             mimeType = mimeTypeFromURL(m_loadedUrl);
61         return mimeType;
62     }
63
64     bool shouldPreferPlugInsForImages() const { return m_shouldPreferPlugInsForImages; }
65
66     // Public for FrameView::addWidgetToUpdate()
67     bool needsWidgetUpdate() const { return m_needsWidgetUpdate; }
68     void setNeedsWidgetUpdate(bool needsWidgetUpdate) { m_needsWidgetUpdate = needsWidgetUpdate; }
69     
70     void userDidClickSnapshot(PassRefPtr<MouseEvent>, bool forwardEvent);
71     void checkSnapshotStatus();
72     Image* snapshotImage() const { return m_snapshotImage.get(); }
73     WEBCORE_EXPORT void restartSnapshottedPlugIn();
74
75     // Plug-in URL might not be the same as url() with overriding parameters.
76     void subframeLoaderWillCreatePlugIn(const URL& plugInURL);
77     void subframeLoaderDidCreatePlugIn(const Widget&);
78
79     WEBCORE_EXPORT void setIsPrimarySnapshottedPlugIn(bool);
80     bool partOfSnapshotOverlay(Node*);
81
82     bool needsCheckForSizeChange() const { return m_needsCheckForSizeChange; }
83     void setNeedsCheckForSizeChange() { m_needsCheckForSizeChange = true; }
84     void checkSizeChangeForSnapshotting();
85
86     enum SnapshotDecision {
87         SnapshotNotYetDecided,
88         NeverSnapshot,
89         Snapshotted,
90         MaySnapshotWhenResized,
91         MaySnapshotWhenContentIsSet
92     };
93     SnapshotDecision snapshotDecision() const { return m_snapshotDecision; }
94
95 protected:
96     enum PreferPlugInsForImagesOption { ShouldPreferPlugInsForImages, ShouldNotPreferPlugInsForImages };
97     HTMLPlugInImageElement(const QualifiedName& tagName, Document&, bool createdByParser, PreferPlugInsForImagesOption);
98
99     virtual void didMoveToNewDocument(Document* oldDocument) override;
100     virtual bool requestObject(const String& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues) override final;
101
102     bool isImageType();
103     HTMLImageLoader* imageLoader() { return m_imageLoader.get(); }
104
105     bool allowedToLoadFrameURL(const String& url);
106     bool wouldLoadAsNetscapePlugin(const String& url, const String& serviceType);
107
108     String m_serviceType;
109     String m_url;
110
111     std::unique_ptr<HTMLImageLoader> m_imageLoader;
112
113 private:
114     virtual bool isPlugInImageElement() const override final { return true; }
115     virtual bool isRestartedPlugin() const override final { return m_isRestartedPlugin; }
116
117     virtual void finishParsingChildren() override final;
118     virtual void didAddUserAgentShadowRoot(ShadowRoot*) override final;
119
120     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
121     virtual bool willRecalcStyle(Style::Change) override final;
122     virtual void didAttachRenderers() override final;
123     virtual void willDetachRenderers() override final;
124
125     virtual void documentWillSuspendForPageCache() override final;
126     virtual void documentDidResumeFromPageCache() override final;
127
128     virtual void defaultEventHandler(Event*) override final;
129     virtual void dispatchPendingMouseClick() override final;
130
131     virtual void updateSnapshot(PassRefPtr<Image>) override final;
132
133     void startLoadingImage();
134     void updateWidgetIfNecessary();
135
136     void simulatedMouseClickTimerFired();
137
138     void restartSimilarPlugIns();
139     void removeSnapshotTimerFired(Timer&);
140     bool isTopLevelFullPagePlugin(const RenderEmbeddedObject&) const;
141
142     URL m_loadedUrl;
143     bool m_needsWidgetUpdate;
144     bool m_shouldPreferPlugInsForImages;
145     bool m_needsDocumentActivationCallbacks;
146     RefPtr<MouseEvent> m_pendingClickEventFromSnapshot;
147     DeferrableOneShotTimer m_simulatedMouseClickTimer;
148     Timer m_removeSnapshotTimer;
149     RefPtr<Image> m_snapshotImage;
150     bool m_createdDuringUserGesture;
151     bool m_isRestartedPlugin;
152     bool m_needsCheckForSizeChange;
153     bool m_plugInWasCreated;
154     bool m_deferredPromotionToPrimaryPlugIn;
155     IntSize m_sizeWhenSnapshotted;
156     SnapshotDecision m_snapshotDecision;
157     bool m_plugInDimensionsSpecified;
158 };
159
160 } // namespace WebCore
161
162 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::HTMLPlugInImageElement)
163     static bool isType(const WebCore::HTMLPlugInElement& element) { return element.isPlugInImageElement(); }
164     static bool isType(const WebCore::Node& node) { return is<WebCore::HTMLPlugInElement>(node) && isType(downcast<WebCore::HTMLPlugInElement>(node)); }
165 SPECIALIZE_TYPE_TRAITS_END()
166
167 #endif // HTMLPlugInImageElement_h