blob: 3663f6a0843947a8a1f58fa978a496cd8d7f1b8e [file] [log] [blame]
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +00001/*
darin@apple.comcdcb72f2014-04-06 20:27:07 +00002 * Copyright (C) 2008, 2009, 2011, 2012, 2014 Apple Inc. All rights reserved.
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +00003 *
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"
beidson@apple.comc1a24e12011-12-15 18:50:59 +000025
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +000026namespace WebCore {
27
28class HTMLImageLoader;
eric@webkit.org918affb2010-09-03 04:04:29 +000029class FrameLoader;
dino@apple.com018d5e42013-02-11 21:34:50 +000030class Image;
jonlee@apple.com64454f92012-11-26 22:36:03 +000031class MouseEvent;
darin@apple.comcdcb72f2014-04-06 20:27:07 +000032class RenderStyle;
jonlee@apple.comf1a18ed2012-12-17 02:43:44 +000033class Widget;
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +000034
abarth@webkit.org12c7af02011-02-02 08:00:19 +000035enum PluginCreationOption {
36 CreateAnyWidgetType,
37 CreateOnlyNonNetscapePlugins,
38};
dino@apple.com018d5e42013-02-11 21:34:50 +000039
darin@apple.comcdcb72f2014-04-06 20:27:07 +000040// Base class for HTMLAppletElement, HTMLEmbedElement, and HTMLObjectElement.
41// FIXME: Should HTMLAppletElement inherit from HTMLPlugInElement directly instead?
shinyak@chromium.org4221ffd2013-01-18 03:57:06 +000042class HTMLPlugInImageElement : public HTMLPlugInElement {
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +000043public:
kbr@google.com61bbd85c2011-12-12 23:05:34 +000044 virtual ~HTMLPlugInImageElement();
beidson@apple.com343e49b2011-12-12 22:00:31 +000045
eric@webkit.org1402eb42010-09-02 09:10:21 +000046 RenderEmbeddedObject* renderEmbeddedObject() const;
eric@webkit.orge164bb62010-09-02 10:58:04 +000047
darin@apple.com11ff47c2016-03-04 16:47:55 +000048 void setDisplayState(DisplayState) override;
dino@apple.come5a9a9c2013-02-21 21:53:01 +000049
abarth@webkit.org12c7af02011-02-02 08:00:19 +000050 virtual void updateWidget(PluginCreationOption) = 0;
eric@webkit.orgf8fade82010-09-03 04:49:14 +000051
andersca@apple.comd86d8422010-12-21 18:29:57 +000052 const String& serviceType() const { return m_serviceType; }
53 const String& url() const { return m_url; }
darin@apple.com5ffbb5c2013-09-27 16:39:41 +000054 const URL& loadedUrl() const { return m_loadedUrl; }
dino@apple.comcf696862013-03-26 23:52:31 +000055
56 const String loadedMimeType() const
57 {
58 String mimeType = serviceType();
59 if (mimeType.isEmpty())
60 mimeType = mimeTypeFromURL(m_loadedUrl);
61 return mimeType;
62 }
63
eric@webkit.orga4c02082011-12-15 22:00:09 +000064 // Public for FrameView::addWidgetToUpdate()
65 bool needsWidgetUpdate() const { return m_needsWidgetUpdate; }
66 void setNeedsWidgetUpdate(bool needsWidgetUpdate) { m_needsWidgetUpdate = needsWidgetUpdate; }
dbates@webkit.org1edd81d2013-12-18 00:15:02 +000067
dino@apple.com435c2ed2013-04-05 01:25:05 +000068 void userDidClickSnapshot(PassRefPtr<MouseEvent>, bool forwardEvent);
dino@apple.com455c0192013-04-16 01:05:39 +000069 void checkSnapshotStatus();
dino@apple.comf8474a72013-02-26 17:16:35 +000070 Image* snapshotImage() const { return m_snapshotImage.get(); }
commit-queue@webkit.org8cc75642014-08-22 18:25:37 +000071 WEBCORE_EXPORT void restartSnapshottedPlugIn();
jonlee@apple.comf494c4f2012-12-11 01:33:15 +000072
73 // Plug-in URL might not be the same as url() with overriding parameters.
darin@apple.com5ffbb5c2013-09-27 16:39:41 +000074 void subframeLoaderWillCreatePlugIn(const URL& plugInURL);
cdumez@apple.com63c654d2014-10-09 16:45:32 +000075 void subframeLoaderDidCreatePlugIn(const Widget&);
dino@apple.com2e06ec82013-04-03 20:13:20 +000076
commit-queue@webkit.org8cc75642014-08-22 18:25:37 +000077 WEBCORE_EXPORT void setIsPrimarySnapshottedPlugIn(bool);
mjs@apple.comfb312bf2015-02-04 07:01:23 +000078 bool partOfSnapshotOverlay(const Node*) const;
jonlee@apple.com64454f92012-11-26 22:36:03 +000079
dino@apple.com455c0192013-04-16 01:05:39 +000080 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,
dino@apple.com40a941f2013-05-27 01:44:32 +000088 MaySnapshotWhenResized,
89 MaySnapshotWhenContentIsSet
dino@apple.com455c0192013-04-16 01:05:39 +000090 };
91 SnapshotDecision snapshotDecision() const { return m_snapshotDecision; }
92
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +000093protected:
andersca@apple.com589100e2015-10-12 17:25:37 +000094 HTMLPlugInImageElement(const QualifiedName& tagName, Document&, bool createdByParser);
darin@apple.comcf9dd0f2009-08-23 06:55:57 +000095
darin@apple.com11ff47c2016-03-04 16:47:55 +000096 void didMoveToNewDocument(Document* oldDocument) override;
darin@apple.com49cc03e2016-03-04 17:20:46 +000097 bool requestObject(const String& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues) final;
darin@apple.comcdcb72f2014-04-06 20:27:07 +000098
darin@apple.comcf9dd0f2009-08-23 06:55:57 +000099 bool isImageType();
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000100 HTMLImageLoader* imageLoader() { return m_imageLoader.get(); }
eric@webkit.orge164bb62010-09-02 10:58:04 +0000101
eric@webkit.org4ffb1fe2010-09-03 04:28:12 +0000102 bool allowedToLoadFrameURL(const String& url);
103 bool wouldLoadAsNetscapePlugin(const String& url, const String& serviceType);
104
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000105 String m_serviceType;
106 String m_url;
slewis@apple.com1365cdf2014-04-02 23:53:30 +0000107
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000108 std::unique_ptr<HTMLImageLoader> m_imageLoader;
dino@apple.com2e88ddc2013-03-19 20:23:43 +0000109
darin@apple.com21e3cf92010-04-06 01:38:15 +0000110private:
darin@apple.com49cc03e2016-03-04 17:20:46 +0000111 bool isPlugInImageElement() const final { return true; }
112 bool isRestartedPlugin() const final { return m_isRestartedPlugin; }
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000113
darin@apple.com49cc03e2016-03-04 17:20:46 +0000114 void finishParsingChildren() final;
115 void didAddUserAgentShadowRoot(ShadowRoot*) final;
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000116
darin@apple.com11ff47c2016-03-04 16:47:55 +0000117 RenderPtr<RenderElement> createElementRenderer(Ref<RenderStyle>&&, const RenderTreePosition&) override;
118 bool childShouldCreateRenderer(const Node&) const override;
darin@apple.com49cc03e2016-03-04 17:20:46 +0000119 bool willRecalcStyle(Style::Change) final;
120 void didAttachRenderers() final;
121 void willDetachRenderers() final;
dino@apple.com018d5e42013-02-11 21:34:50 +0000122
darin@apple.com49cc03e2016-03-04 17:20:46 +0000123 void prepareForDocumentSuspension() final;
124 void resumeFromDocumentSuspension() final;
dino@apple.com018d5e42013-02-11 21:34:50 +0000125
darin@apple.com49cc03e2016-03-04 17:20:46 +0000126 void defaultEventHandler(Event*) final;
127 void dispatchPendingMouseClick() final;
eric@webkit.org1402eb42010-09-02 09:10:21 +0000128
darin@apple.com49cc03e2016-03-04 17:20:46 +0000129 void updateSnapshot(PassRefPtr<Image>) final;
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000130
slewis@apple.com1365cdf2014-04-02 23:53:30 +0000131 void startLoadingImage();
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000132 void updateWidgetIfNecessary();
dino@apple.com018d5e42013-02-11 21:34:50 +0000133
andersca@apple.com8ef4e622014-06-02 23:44:48 +0000134 void simulatedMouseClickTimerFired();
jonlee@apple.com9b6356d2012-10-08 21:27:29 +0000135
dino@apple.comcf696862013-03-26 23:52:31 +0000136 void restartSimilarPlugIns();
andersca@apple.com574a7452014-11-21 20:10:13 +0000137 void removeSnapshotTimerFired();
roger_fong@apple.com558b1982014-04-16 00:26:11 +0000138 bool isTopLevelFullPagePlugin(const RenderEmbeddedObject&) const;
dino@apple.com2e06ec82013-04-03 20:13:20 +0000139
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000140 URL m_loadedUrl;
eric@webkit.org1402eb42010-09-02 09:10:21 +0000141 bool m_needsWidgetUpdate;
beidson@apple.com343e49b2011-12-12 22:00:31 +0000142 bool m_needsDocumentActivationCallbacks;
jonlee@apple.com64454f92012-11-26 22:36:03 +0000143 RefPtr<MouseEvent> m_pendingClickEventFromSnapshot;
andersca@apple.com8ef4e622014-06-02 23:44:48 +0000144 DeferrableOneShotTimer m_simulatedMouseClickTimer;
jer.noble@apple.com50862fe2014-11-06 23:06:03 +0000145 Timer m_removeSnapshotTimer;
dino@apple.com018d5e42013-02-11 21:34:50 +0000146 RefPtr<Image> m_snapshotImage;
dino@apple.comd51798b2013-03-11 22:51:43 +0000147 bool m_createdDuringUserGesture;
dino@apple.com5fdf3c82013-04-16 02:52:00 +0000148 bool m_isRestartedPlugin;
dino@apple.com455c0192013-04-16 01:05:39 +0000149 bool m_needsCheckForSizeChange;
timothy_horton@apple.com3019d202013-04-16 22:58:03 +0000150 bool m_plugInWasCreated;
151 bool m_deferredPromotionToPrimaryPlugIn;
dino@apple.com455c0192013-04-16 01:05:39 +0000152 IntSize m_sizeWhenSnapshotted;
153 SnapshotDecision m_snapshotDecision;
roger_fong@apple.com558b1982014-04-16 00:26:11 +0000154 bool m_plugInDimensionsSpecified;
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +0000155};
156
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +0000157} // namespace WebCore
158
cdumez@apple.com3e58f0f2014-09-30 21:32:55 +0000159SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::HTMLPlugInImageElement)
160 static bool isType(const WebCore::HTMLPlugInElement& element) { return element.isPlugInImageElement(); }
161 static bool isType(const WebCore::Node& node) { return is<WebCore::HTMLPlugInElement>(node) && isType(downcast<WebCore::HTMLPlugInElement>(node)); }
162SPECIALIZE_TYPE_TRAITS_END()
163
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +0000164#endif // HTMLPlugInImageElement_h