DOM event handling should pass Event around by reference.
[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 class CreatePlugins {
36     No,
37     Yes,
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     void setDisplayState(DisplayState) override;
49
50     virtual void updateWidget(CreatePlugins) = 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     // Public for FrameView::addWidgetToUpdate()
65     bool needsWidgetUpdate() const { return m_needsWidgetUpdate; }
66     void setNeedsWidgetUpdate(bool needsWidgetUpdate) { m_needsWidgetUpdate = needsWidgetUpdate; }
67     
68     void userDidClickSnapshot(PassRefPtr<MouseEvent>, bool forwardEvent);
69     void checkSnapshotStatus();
70     Image* snapshotImage() const { return m_snapshotImage.get(); }
71     WEBCORE_EXPORT void restartSnapshottedPlugIn();
72
73     // Plug-in URL might not be the same as url() with overriding parameters.
74     void subframeLoaderWillCreatePlugIn(const URL& plugInURL);
75     void subframeLoaderDidCreatePlugIn(const Widget&);
76
77     WEBCORE_EXPORT void setIsPrimarySnapshottedPlugIn(bool);
78     bool partOfSnapshotOverlay(const Node*) const;
79
80     bool needsCheckForSizeChange() const { return m_needsCheckForSizeChange; }
81     void setNeedsCheckForSizeChange() { m_needsCheckForSizeChange = true; }
82     void checkSizeChangeForSnapshotting();
83
84     enum SnapshotDecision {
85         SnapshotNotYetDecided,
86         NeverSnapshot,
87         Snapshotted,
88         MaySnapshotWhenResized,
89         MaySnapshotWhenContentIsSet
90     };
91     SnapshotDecision snapshotDecision() const { return m_snapshotDecision; }
92
93 protected:
94     HTMLPlugInImageElement(const QualifiedName& tagName, Document&, bool createdByParser);
95
96     void didMoveToNewDocument(Document* oldDocument) override;
97     bool requestObject(const String& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues) final;
98
99     bool isImageType();
100     HTMLImageLoader* imageLoader() { return m_imageLoader.get(); }
101
102     bool allowedToLoadFrameURL(const String& url);
103     bool wouldLoadAsPlugIn(const String& url, const String& serviceType);
104
105     String m_serviceType;
106     String m_url;
107
108     std::unique_ptr<HTMLImageLoader> m_imageLoader;
109
110 private:
111     bool isPlugInImageElement() const final { return true; }
112     bool isRestartedPlugin() const final { return m_isRestartedPlugin; }
113
114     bool allowedToLoadPluginContent(const String& url, const String& mimeType) const;
115
116     void finishParsingChildren() final;
117     void didAddUserAgentShadowRoot(ShadowRoot*) final;
118
119     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
120     bool childShouldCreateRenderer(const Node&) const override;
121     bool willRecalcStyle(Style::Change) final;
122     void didAttachRenderers() final;
123     void willDetachRenderers() final;
124
125     void prepareForDocumentSuspension() final;
126     void resumeFromDocumentSuspension() final;
127
128     void defaultEventHandler(Event&) final;
129     void dispatchPendingMouseClick() final;
130
131     void updateSnapshot(PassRefPtr<Image>) final;
132
133     void startLoadingImage();
134     void updateWidgetIfNecessary();
135
136     void simulatedMouseClickTimerFired();
137
138     void restartSimilarPlugIns();
139     void removeSnapshotTimerFired();
140     bool isTopLevelFullPagePlugin(const RenderEmbeddedObject&) const;
141
142     URL m_loadedUrl;
143     bool m_needsWidgetUpdate;
144     bool m_needsDocumentActivationCallbacks;
145     RefPtr<MouseEvent> m_pendingClickEventFromSnapshot;
146     DeferrableOneShotTimer m_simulatedMouseClickTimer;
147     Timer m_removeSnapshotTimer;
148     RefPtr<Image> m_snapshotImage;
149     bool m_createdDuringUserGesture;
150     bool m_isRestartedPlugin;
151     bool m_needsCheckForSizeChange;
152     bool m_plugInWasCreated;
153     bool m_deferredPromotionToPrimaryPlugIn;
154     IntSize m_sizeWhenSnapshotted;
155     SnapshotDecision m_snapshotDecision;
156     bool m_plugInDimensionsSpecified;
157 };
158
159 } // namespace WebCore
160
161 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::HTMLPlugInImageElement)
162     static bool isType(const WebCore::HTMLPlugInElement& element) { return element.isPlugInImageElement(); }
163     static bool isType(const WebCore::Node& node) { return is<WebCore::HTMLPlugInElement>(node) && isType(downcast<WebCore::HTMLPlugInElement>(node)); }
164 SPECIALIZE_TYPE_TRAITS_END()
165
166 #endif // HTMLPlugInImageElement_h