e941f57adf8a19a9ed14edceb097bd3ab4a4fa62
[WebKit.git] / Source / WebCore / html / HTMLPlugInImageElement.h
1 /*
2  * Copyright (C) 2008-2017 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 #pragma once
22
23 #include "HTMLPlugInElement.h"
24
25 namespace WebCore {
26
27 class HTMLImageLoader;
28 class MouseEvent;
29
30 enum class CreatePlugins { No, Yes };
31
32 // Base class for HTMLAppletElement, HTMLEmbedElement, and HTMLObjectElement.
33 // FIXME: Perhaps HTMLAppletElement should inherit from HTMLPlugInElement directly instead.
34 class HTMLPlugInImageElement : public HTMLPlugInElement {
35 public:
36     virtual ~HTMLPlugInImageElement();
37
38     RenderEmbeddedObject* renderEmbeddedObject() const;
39
40     virtual void updateWidget(CreatePlugins) = 0;
41
42     const String& serviceType() const { return m_serviceType; }
43     const String& url() const { return m_url; }
44     const URL& loadedUrl() const { return m_loadedUrl; }
45
46     String loadedMimeType() const
47     {
48         String mimeType = serviceType();
49         if (mimeType.isEmpty())
50             mimeType = mimeTypeFromURL(m_loadedUrl);
51         return mimeType;
52     }
53
54     // Public for FrameView::addWidgetToUpdate()
55     bool needsWidgetUpdate() const { return m_needsWidgetUpdate; }
56     void setNeedsWidgetUpdate(bool needsWidgetUpdate) { m_needsWidgetUpdate = needsWidgetUpdate; }
57     
58     void userDidClickSnapshot(MouseEvent&, bool forwardEvent);
59     void checkSnapshotStatus();
60     Image* snapshotImage() const { return m_snapshotImage.get(); }
61     WEBCORE_EXPORT void restartSnapshottedPlugIn();
62
63     // Plug-in URL might not be the same as url() with overriding parameters.
64     void subframeLoaderWillCreatePlugIn(const URL& plugInURL);
65     void subframeLoaderDidCreatePlugIn(const Widget&);
66
67     WEBCORE_EXPORT void setIsPrimarySnapshottedPlugIn(bool);
68     bool partOfSnapshotOverlay(const Node*) const;
69
70     bool needsCheckForSizeChange() const { return m_needsCheckForSizeChange; }
71     void setNeedsCheckForSizeChange() { m_needsCheckForSizeChange = true; }
72     void checkSizeChangeForSnapshotting();
73
74     enum SnapshotDecision {
75         SnapshotNotYetDecided,
76         NeverSnapshot,
77         Snapshotted,
78         MaySnapshotWhenResized,
79         MaySnapshotWhenContentIsSet
80     };
81     SnapshotDecision snapshotDecision() const { return m_snapshotDecision; }
82
83 protected:
84     HTMLPlugInImageElement(const QualifiedName& tagName, Document&);
85     void finishCreating();
86
87     void didMoveToNewDocument(Document& oldDocument, Document& newDocument) override;
88
89     bool requestObject(const String& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues) final;
90
91     bool isImageType();
92     HTMLImageLoader* imageLoader() { return m_imageLoader.get(); }
93     void updateImageLoaderWithNewURLSoon();
94
95     bool allowedToLoadFrameURL(const String& url);
96     bool wouldLoadAsPlugIn(const String& url, const String& serviceType);
97
98     void scheduleUpdateForAfterStyleResolution();
99
100     String m_serviceType;
101     String m_url;
102
103 private:
104     bool isPlugInImageElement() const final { return true; }
105     bool isRestartedPlugin() const final { return m_isRestartedPlugin; }
106
107     bool allowedToLoadPluginContent(const String& url, const String& mimeType) const;
108
109     void didAddUserAgentShadowRoot(ShadowRoot*) final;
110
111     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
112     bool childShouldCreateRenderer(const Node&) const override;
113     void willRecalcStyle(Style::Change) final;
114     void didRecalcStyle(Style::Change) final;
115     void didAttachRenderers() final;
116     void willDetachRenderers() final;
117
118     void prepareForDocumentSuspension() final;
119     void resumeFromDocumentSuspension() final;
120
121     void defaultEventHandler(Event&) final;
122     void dispatchPendingMouseClick() final;
123
124     void updateSnapshot(Image*) final;
125
126     void updateAfterStyleResolution();
127
128     void simulatedMouseClickTimerFired();
129
130     void restartSimilarPlugIns();
131     void removeSnapshotTimerFired();
132     bool isTopLevelFullPagePlugin(const RenderEmbeddedObject&) const;
133
134     void setDisplayState(DisplayState) final;
135
136     URL m_loadedUrl;
137     bool m_needsWidgetUpdate { false };
138     bool m_needsDocumentActivationCallbacks { false };
139     RefPtr<MouseEvent> m_pendingClickEventFromSnapshot;
140     DeferrableOneShotTimer m_simulatedMouseClickTimer;
141     Timer m_removeSnapshotTimer;
142     RefPtr<Image> m_snapshotImage;
143     bool m_createdDuringUserGesture { false };
144     bool m_isRestartedPlugin { false };
145     bool m_needsCheckForSizeChange { false };
146     bool m_plugInWasCreated { false };
147     bool m_deferredPromotionToPrimaryPlugIn { false };
148     IntSize m_sizeWhenSnapshotted;
149     SnapshotDecision m_snapshotDecision { SnapshotNotYetDecided };
150     bool m_plugInDimensionsSpecified { false };
151     std::unique_ptr<HTMLImageLoader> m_imageLoader;
152     bool m_needsImageReload { false };
153     bool m_hasUpdateScheduledForAfterStyleResolution { false };
154 };
155
156 } // namespace WebCore
157
158 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::HTMLPlugInImageElement)
159     static bool isType(const WebCore::HTMLPlugInElement& element) { return element.isPlugInImageElement(); }
160     static bool isType(const WebCore::Node& node) { return is<WebCore::HTMLPlugInElement>(node) && isType(downcast<WebCore::HTMLPlugInElement>(node)); }
161 SPECIALIZE_TYPE_TRAITS_END()