HTMLPlugInImageElement.h [plain text]
#ifndef HTMLPlugInImageElement_h
#define HTMLPlugInImageElement_h
#include "HTMLPlugInElement.h"
namespace WebCore {
class HTMLImageLoader;
class FrameLoader;
class Image;
class MouseEvent;
class RenderStyle;
class Widget;
enum PluginCreationOption {
CreateAnyWidgetType,
CreateOnlyNonNetscapePlugins,
};
class HTMLPlugInImageElement : public HTMLPlugInElement {
public:
virtual ~HTMLPlugInImageElement();
RenderEmbeddedObject* renderEmbeddedObject() const;
virtual void setDisplayState(DisplayState) override;
virtual void updateWidget(PluginCreationOption) = 0;
const String& serviceType() const { return m_serviceType; }
const String& url() const { return m_url; }
const URL& loadedUrl() const { return m_loadedUrl; }
const String loadedMimeType() const
{
String mimeType = serviceType();
if (mimeType.isEmpty())
mimeType = mimeTypeFromURL(m_loadedUrl);
return mimeType;
}
bool shouldPreferPlugInsForImages() const { return m_shouldPreferPlugInsForImages; }
bool needsWidgetUpdate() const { return m_needsWidgetUpdate; }
void setNeedsWidgetUpdate(bool needsWidgetUpdate) { m_needsWidgetUpdate = needsWidgetUpdate; }
void userDidClickSnapshot(PassRefPtr<MouseEvent>, bool forwardEvent);
void checkSnapshotStatus();
Image* snapshotImage() const { return m_snapshotImage.get(); }
void restartSnapshottedPlugIn();
void subframeLoaderWillCreatePlugIn(const URL& plugInURL);
void subframeLoaderDidCreatePlugIn(const Widget*);
void setIsPrimarySnapshottedPlugIn(bool);
bool partOfSnapshotOverlay(Node*);
bool needsCheckForSizeChange() const { return m_needsCheckForSizeChange; }
void setNeedsCheckForSizeChange() { m_needsCheckForSizeChange = true; }
void checkSizeChangeForSnapshotting();
enum SnapshotDecision {
SnapshotNotYetDecided,
NeverSnapshot,
Snapshotted,
MaySnapshotWhenResized,
MaySnapshotWhenContentIsSet
};
SnapshotDecision snapshotDecision() const { return m_snapshotDecision; }
protected:
enum PreferPlugInsForImagesOption { ShouldPreferPlugInsForImages, ShouldNotPreferPlugInsForImages };
HTMLPlugInImageElement(const QualifiedName& tagName, Document&, bool createdByParser, PreferPlugInsForImagesOption);
virtual void didMoveToNewDocument(Document* oldDocument) override;
virtual bool requestObject(const String& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues) override final;
bool isImageType();
HTMLImageLoader* imageLoader() { return m_imageLoader.get(); }
bool allowedToLoadFrameURL(const String& url);
bool wouldLoadAsNetscapePlugin(const String& url, const String& serviceType);
String m_serviceType;
String m_url;
std::unique_ptr<HTMLImageLoader> m_imageLoader;
private:
virtual bool isPlugInImageElement() const override final { return true; }
virtual bool isRestartedPlugin() const override final { return m_isRestartedPlugin; }
virtual void finishParsingChildren() override final;
virtual void didAddUserAgentShadowRoot(ShadowRoot*) override final;
virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
virtual bool willRecalcStyle(Style::Change) override final;
virtual void didAttachRenderers() override final;
virtual void willDetachRenderers() override final;
virtual void documentWillSuspendForPageCache() override final;
virtual void documentDidResumeFromPageCache() override final;
virtual void defaultEventHandler(Event*) override final;
virtual void dispatchPendingMouseClick() override final;
virtual void updateSnapshot(PassRefPtr<Image>) override final;
void startLoadingImage();
void updateWidgetIfNecessary();
void simulatedMouseClickTimerFired();
void restartSimilarPlugIns();
void removeSnapshotTimerFired(Timer<HTMLPlugInImageElement>&);
bool isTopLevelFullPagePlugin(const RenderEmbeddedObject&) const;
URL m_loadedUrl;
bool m_needsWidgetUpdate;
bool m_shouldPreferPlugInsForImages;
bool m_needsDocumentActivationCallbacks;
RefPtr<MouseEvent> m_pendingClickEventFromSnapshot;
DeferrableOneShotTimer m_simulatedMouseClickTimer;
Timer<HTMLPlugInImageElement> m_removeSnapshotTimer;
RefPtr<Image> m_snapshotImage;
bool m_createdDuringUserGesture;
bool m_isRestartedPlugin;
bool m_needsCheckForSizeChange;
bool m_plugInWasCreated;
bool m_deferredPromotionToPrimaryPlugIn;
IntSize m_sizeWhenSnapshotted;
SnapshotDecision m_snapshotDecision;
bool m_plugInDimensionsSpecified;
};
void isHTMLPlugInImageElement(const HTMLPlugInImageElement&); inline bool isHTMLPlugInImageElement(const HTMLPlugInElement& element) { return element.isPlugInImageElement(); }
inline bool isHTMLPlugInImageElement(const Node& node) { return node.isPluginElement() && toHTMLPlugInElement(node).isPlugInImageElement(); }
template <> inline bool isElementOfType<const HTMLPlugInImageElement>(const Element& element) { return isHTMLPlugInImageElement(element); }
NODE_TYPE_CASTS(HTMLPlugInImageElement)
}
#endif // HTMLPlugInImageElement_h