blob: b1c7626a3c4e94c9cdd08d8ffa2da1c34f35fb73 [file] [log] [blame]
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +00001/*
darin@apple.com9e71e5e2017-01-05 06:45:48 +00002 * Copyright (C) 2008-2017 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
commit-queue@webkit.orgd862d772016-10-31 22:07:53 +000021#pragma once
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +000022
23#include "HTMLPlugInElement.h"
beidson@apple.comc1a24e12011-12-15 18:50:59 +000024
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +000025namespace WebCore {
26
27class HTMLImageLoader;
jonlee@apple.com64454f92012-11-26 22:36:03 +000028class MouseEvent;
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +000029
darin@apple.comaeea79fb2016-12-12 00:56:25 +000030enum class CreatePlugins { No, Yes };
dino@apple.com018d5e42013-02-11 21:34:50 +000031
darin@apple.comcdcb72f2014-04-06 20:27:07 +000032// Base class for HTMLAppletElement, HTMLEmbedElement, and HTMLObjectElement.
darin@apple.comaeea79fb2016-12-12 00:56:25 +000033// FIXME: Perhaps HTMLAppletElement should inherit from HTMLPlugInElement directly instead.
shinyak@chromium.org4221ffd2013-01-18 03:57:06 +000034class HTMLPlugInImageElement : public HTMLPlugInElement {
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +000035public:
kbr@google.com61bbd85c2011-12-12 23:05:34 +000036 virtual ~HTMLPlugInImageElement();
beidson@apple.com343e49b2011-12-12 22:00:31 +000037
eric@webkit.org1402eb42010-09-02 09:10:21 +000038 RenderEmbeddedObject* renderEmbeddedObject() const;
eric@webkit.orge164bb62010-09-02 10:58:04 +000039
andersca@apple.com39049e22016-08-10 01:31:17 +000040 virtual void updateWidget(CreatePlugins) = 0;
eric@webkit.orgf8fade82010-09-03 04:49:14 +000041
andersca@apple.comd86d8422010-12-21 18:29:57 +000042 const String& serviceType() const { return m_serviceType; }
43 const String& url() const { return m_url; }
darin@apple.com5ffbb5c2013-09-27 16:39:41 +000044 const URL& loadedUrl() const { return m_loadedUrl; }
dino@apple.comcf696862013-03-26 23:52:31 +000045
darin@apple.comaeea79fb2016-12-12 00:56:25 +000046 String loadedMimeType() const
dino@apple.comcf696862013-03-26 23:52:31 +000047 {
48 String mimeType = serviceType();
49 if (mimeType.isEmpty())
50 mimeType = mimeTypeFromURL(m_loadedUrl);
51 return mimeType;
52 }
53
eric@webkit.orga4c02082011-12-15 22:00:09 +000054 // Public for FrameView::addWidgetToUpdate()
55 bool needsWidgetUpdate() const { return m_needsWidgetUpdate; }
56 void setNeedsWidgetUpdate(bool needsWidgetUpdate) { m_needsWidgetUpdate = needsWidgetUpdate; }
dbates@webkit.org1edd81d2013-12-18 00:15:02 +000057
darin@apple.comaeea79fb2016-12-12 00:56:25 +000058 void userDidClickSnapshot(MouseEvent&, bool forwardEvent);
dino@apple.com455c0192013-04-16 01:05:39 +000059 void checkSnapshotStatus();
dino@apple.comf8474a72013-02-26 17:16:35 +000060 Image* snapshotImage() const { return m_snapshotImage.get(); }
commit-queue@webkit.org8cc75642014-08-22 18:25:37 +000061 WEBCORE_EXPORT void restartSnapshottedPlugIn();
jonlee@apple.comf494c4f2012-12-11 01:33:15 +000062
63 // Plug-in URL might not be the same as url() with overriding parameters.
darin@apple.com5ffbb5c2013-09-27 16:39:41 +000064 void subframeLoaderWillCreatePlugIn(const URL& plugInURL);
cdumez@apple.com63c654d2014-10-09 16:45:32 +000065 void subframeLoaderDidCreatePlugIn(const Widget&);
dino@apple.com2e06ec82013-04-03 20:13:20 +000066
commit-queue@webkit.org8cc75642014-08-22 18:25:37 +000067 WEBCORE_EXPORT void setIsPrimarySnapshottedPlugIn(bool);
mjs@apple.comfb312bf2015-02-04 07:01:23 +000068 bool partOfSnapshotOverlay(const Node*) const;
jonlee@apple.com64454f92012-11-26 22:36:03 +000069
dino@apple.com455c0192013-04-16 01:05:39 +000070 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,
dino@apple.com40a941f2013-05-27 01:44:32 +000078 MaySnapshotWhenResized,
79 MaySnapshotWhenContentIsSet
dino@apple.com455c0192013-04-16 01:05:39 +000080 };
81 SnapshotDecision snapshotDecision() const { return m_snapshotDecision; }
82
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +000083protected:
andersca@apple.com589100e2015-10-12 17:25:37 +000084 HTMLPlugInImageElement(const QualifiedName& tagName, Document&, bool createdByParser);
darin@apple.comcf9dd0f2009-08-23 06:55:57 +000085
cdumez@apple.com33db0592016-11-17 00:39:55 +000086 void didMoveToNewDocument(Document& oldDocument) override;
darin@apple.com49cc03e2016-03-04 17:20:46 +000087 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 +000088
darin@apple.comcf9dd0f2009-08-23 06:55:57 +000089 bool isImageType();
darin@apple.comcdcb72f2014-04-06 20:27:07 +000090 HTMLImageLoader* imageLoader() { return m_imageLoader.get(); }
eric@webkit.orge164bb62010-09-02 10:58:04 +000091
eric@webkit.org4ffb1fe2010-09-03 04:28:12 +000092 bool allowedToLoadFrameURL(const String& url);
andersca@apple.com39049e22016-08-10 01:31:17 +000093 bool wouldLoadAsPlugIn(const String& url, const String& serviceType);
eric@webkit.org4ffb1fe2010-09-03 04:28:12 +000094
darin@apple.comcdcb72f2014-04-06 20:27:07 +000095 String m_serviceType;
96 String m_url;
slewis@apple.com1365cdf2014-04-02 23:53:30 +000097
darin@apple.comcdcb72f2014-04-06 20:27:07 +000098 std::unique_ptr<HTMLImageLoader> m_imageLoader;
dino@apple.com2e88ddc2013-03-19 20:23:43 +000099
darin@apple.com21e3cf92010-04-06 01:38:15 +0000100private:
darin@apple.com49cc03e2016-03-04 17:20:46 +0000101 bool isPlugInImageElement() const final { return true; }
102 bool isRestartedPlugin() const final { return m_isRestartedPlugin; }
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000103
dbates@webkit.orga3216392016-07-22 20:33:11 +0000104 bool allowedToLoadPluginContent(const String& url, const String& mimeType) const;
105
darin@apple.com49cc03e2016-03-04 17:20:46 +0000106 void finishParsingChildren() final;
107 void didAddUserAgentShadowRoot(ShadowRoot*) final;
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000108
antti@apple.com454418f2016-04-25 19:49:23 +0000109 RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
darin@apple.com11ff47c2016-03-04 16:47:55 +0000110 bool childShouldCreateRenderer(const Node&) const override;
antti@apple.com81bb8da2016-11-24 12:54:00 +0000111 void willRecalcStyle(Style::Change) final;
darin@apple.com49cc03e2016-03-04 17:20:46 +0000112 void didAttachRenderers() final;
113 void willDetachRenderers() final;
dino@apple.com018d5e42013-02-11 21:34:50 +0000114
darin@apple.com49cc03e2016-03-04 17:20:46 +0000115 void prepareForDocumentSuspension() final;
116 void resumeFromDocumentSuspension() final;
dino@apple.com018d5e42013-02-11 21:34:50 +0000117
akling@apple.come8090dd2016-08-31 16:32:44 +0000118 void defaultEventHandler(Event&) final;
darin@apple.com49cc03e2016-03-04 17:20:46 +0000119 void dispatchPendingMouseClick() final;
eric@webkit.org1402eb42010-09-02 09:10:21 +0000120
darin@apple.com9e71e5e2017-01-05 06:45:48 +0000121 void updateSnapshot(Image*) final;
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000122
slewis@apple.com1365cdf2014-04-02 23:53:30 +0000123 void startLoadingImage();
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000124 void updateWidgetIfNecessary();
dino@apple.com018d5e42013-02-11 21:34:50 +0000125
andersca@apple.com8ef4e622014-06-02 23:44:48 +0000126 void simulatedMouseClickTimerFired();
jonlee@apple.com9b6356d2012-10-08 21:27:29 +0000127
dino@apple.comcf696862013-03-26 23:52:31 +0000128 void restartSimilarPlugIns();
andersca@apple.com574a7452014-11-21 20:10:13 +0000129 void removeSnapshotTimerFired();
roger_fong@apple.com558b1982014-04-16 00:26:11 +0000130 bool isTopLevelFullPagePlugin(const RenderEmbeddedObject&) const;
dino@apple.com2e06ec82013-04-03 20:13:20 +0000131
darin@apple.comaeea79fb2016-12-12 00:56:25 +0000132 void setDisplayState(DisplayState) final;
133
darin@apple.comcdcb72f2014-04-06 20:27:07 +0000134 URL m_loadedUrl;
darin@apple.comaeea79fb2016-12-12 00:56:25 +0000135 bool m_needsWidgetUpdate { false };
136 bool m_needsDocumentActivationCallbacks { false };
jonlee@apple.com64454f92012-11-26 22:36:03 +0000137 RefPtr<MouseEvent> m_pendingClickEventFromSnapshot;
andersca@apple.com8ef4e622014-06-02 23:44:48 +0000138 DeferrableOneShotTimer m_simulatedMouseClickTimer;
jer.noble@apple.com50862fe2014-11-06 23:06:03 +0000139 Timer m_removeSnapshotTimer;
dino@apple.com018d5e42013-02-11 21:34:50 +0000140 RefPtr<Image> m_snapshotImage;
darin@apple.comaeea79fb2016-12-12 00:56:25 +0000141 bool m_createdDuringUserGesture { false };
142 bool m_isRestartedPlugin { false };
143 bool m_needsCheckForSizeChange { false };
144 bool m_plugInWasCreated { false };
145 bool m_deferredPromotionToPrimaryPlugIn { false };
dino@apple.com455c0192013-04-16 01:05:39 +0000146 IntSize m_sizeWhenSnapshotted;
darin@apple.comaeea79fb2016-12-12 00:56:25 +0000147 SnapshotDecision m_snapshotDecision { SnapshotNotYetDecided };
148 bool m_plugInDimensionsSpecified { false };
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +0000149};
150
ddkilzer@apple.comd5bccb52008-08-06 17:23:22 +0000151} // namespace WebCore
152
cdumez@apple.com3e58f0f2014-09-30 21:32:55 +0000153SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::HTMLPlugInImageElement)
154 static bool isType(const WebCore::HTMLPlugInElement& element) { return element.isPlugInImageElement(); }
155 static bool isType(const WebCore::Node& node) { return is<WebCore::HTMLPlugInElement>(node) && isType(downcast<WebCore::HTMLPlugInElement>(node)); }
156SPECIALIZE_TYPE_TRAITS_END()