diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-10-15 16:08:57 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-10-15 16:08:57 +0200 |
commit | 5466563f4b5b6b86523e3f89bb7f77e5b5270c78 (patch) | |
tree | 8caccf7cd03a15207cde3ba282c88bf132482a91 /Source/WebKit2/WebProcess/Plugins/PluginView.cpp | |
parent | 33b26980cb24288b5a9f2590ccf32a949281bb79 (diff) | |
download | qtwebkit-5466563f4b5b6b86523e3f89bb7f77e5b5270c78.tar.gz |
Imported WebKit commit 0dc6cd75e1d4836eaffbb520be96fac4847cc9d2 (http://svn.webkit.org/repository/webkit/trunk@131300)
WebKit update which introduces the QtWebKitWidgets module that contains the WK1
widgets based API. (In fact it renames QtWebKit to QtWebKitWidgets while we're
working on completing the entire split as part of
https://bugs.webkit.org/show_bug.cgi?id=99314
Diffstat (limited to 'Source/WebKit2/WebProcess/Plugins/PluginView.cpp')
-rw-r--r-- | Source/WebKit2/WebProcess/Plugins/PluginView.cpp | 99 |
1 files changed, 86 insertions, 13 deletions
diff --git a/Source/WebKit2/WebProcess/Plugins/PluginView.cpp b/Source/WebKit2/WebProcess/Plugins/PluginView.cpp index e2a6e1f05..d0a5e1e2c 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginView.cpp +++ b/Source/WebKit2/WebProcess/Plugins/PluginView.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Apple Inc. All rights reserved. + * Copyright (C) 2010, 2012 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -67,6 +67,8 @@ using namespace WebCore; namespace WebKit { +static const double pluginSnapshotTimerDelay = 3; + class PluginView::URLRequest : public RefCounted<URLRequest> { public: static PassRefPtr<PluginView::URLRequest> create(uint64_t requestID, const FrameLoadRequest& request, bool allowPopups) @@ -170,9 +172,9 @@ static String buildHTTPHeaders(const ResourceResponse& response, long long& expe HTTPHeaderMap::const_iterator end = response.httpHeaderFields().end(); for (HTTPHeaderMap::const_iterator it = response.httpHeaderFields().begin(); it != end; ++it) { - stringBuilder.append(it->first.characters(), it->first.length()); + stringBuilder.append(it->key.characters(), it->key.length()); stringBuilder.append(separator.characters(), separator.length()); - stringBuilder.append(it->second.characters(), it->second.length()); + stringBuilder.append(it->value.characters(), it->value.length()); stringBuilder.append('\n'); } @@ -268,6 +270,8 @@ PluginView::PluginView(PassRefPtr<HTMLPlugInElement> pluginElement, PassRefPtr<P , m_npRuntimeObjectMap(this) #endif , m_manualStreamState(StreamStateInitial) + , m_pluginSnapshotTimer(this, &PluginView::pluginSnapshotTimerFired, pluginSnapshotTimerDelay) + , m_pageScaleFactor(1) { m_webPage->addPluginView(this); } @@ -282,9 +286,18 @@ PluginView::~PluginView() if (m_isWaitingUntilMediaCanStart) m_pluginElement->document()->removeMediaCanStartListener(this); + destroyPluginAndReset(); + + // Null out the plug-in element explicitly so we'll crash earlier if we try to use + // the plug-in view after it's been destroyed. + m_pluginElement = nullptr; +} + +void PluginView::destroyPluginAndReset() +{ // Cancel all pending frame loads. for (FrameLoadMap::iterator it = m_pendingFrameLoads.begin(), end = m_pendingFrameLoads.end(); it != end; ++it) - it->first->setLoadListener(0); + it->key->setLoadListener(0); if (m_plugin) { m_isBeingDestroyed = true; @@ -302,10 +315,26 @@ PluginView::~PluginView() #endif cancelAllStreams(); +} - // Null out the plug-in element explicitly so we'll crash earlier if we try to use - // the plug-in view after it's been destroyed. - m_pluginElement = nullptr; +void PluginView::recreateAndInitialize(PassRefPtr<Plugin> plugin) +{ + if (m_plugin) { + if (m_pluginSnapshotTimer.isActive()) + m_pluginSnapshotTimer.stop(); + destroyPluginAndReset(); + } + + // Reset member variables to initial values. + m_plugin = plugin; + m_isInitialized = false; + m_isWaitingForSynchronousInitialization = false; + m_isWaitingUntilMediaCanStart = false; + m_isBeingDestroyed = false; + m_manualStreamState = StreamStateInitial; + m_transientPaintingSnapshot = nullptr; + + initializePlugin(); } Frame* PluginView::frame() const @@ -399,6 +428,18 @@ void PluginView::pageScaleFactorDidChange() viewGeometryDidChange(); } +void PluginView::setPageScaleFactor(double scaleFactor, IntPoint) +{ + m_pageScaleFactor = scaleFactor; + m_webPage->send(Messages::WebPageProxy::PageScaleFactorDidChange(scaleFactor)); + pageScaleFactorDidChange(); +} + +double PluginView::pageScaleFactor() +{ + return m_pageScaleFactor; +} + void PluginView::webPageDestroyed() { m_webPage = 0; @@ -513,7 +554,9 @@ void PluginView::didInitializePlugin() redeliverManualStream(); #if PLATFORM(MAC) - if (m_plugin->pluginLayer()) { + if (m_pluginElement->displayState() < HTMLPlugInElement::Playing) + m_pluginSnapshotTimer.restart(); + else if (m_plugin->pluginLayer()) { if (frame()) { frame()->view()->enterCompositingMode(); m_pluginElement->setNeedsStyleRecalc(SyntheticStyleChange); @@ -643,7 +686,7 @@ void PluginView::setFrameRect(const WebCore::IntRect& rect) void PluginView::paint(GraphicsContext* context, const IntRect& /*dirtyRect*/) { - if (!m_plugin || !m_isInitialized) + if (!m_plugin || !m_isInitialized || m_pluginElement->displayState() < HTMLPlugInElement::Playing) return; if (context->paintingDisabled()) { @@ -658,8 +701,8 @@ void PluginView::paint(GraphicsContext* context, const IntRect& /*dirtyRect*/) if (paintRect.isEmpty()) return; - if (m_snapshot) { - m_snapshot->paint(*context, contentsScaleFactor(), frameRect().location(), m_snapshot->bounds()); + if (m_transientPaintingSnapshot) { + m_transientPaintingSnapshot->paint(*context, contentsScaleFactor(), frameRect().location(), m_transientPaintingSnapshot->bounds()); return; } @@ -730,16 +773,26 @@ void PluginView::handleEvent(Event* event) if (didHandleEvent) event->setDefaultHandled(); } + +bool PluginView::handleEditingCommand(const String& commandName, const String& argument) +{ + return m_plugin->handleEditingCommand(commandName, argument); +} + +bool PluginView::isEditingCommandEnabled(const String& commandName) +{ + return m_plugin->isEditingCommandEnabled(commandName); +} void PluginView::notifyWidget(WidgetNotification notification) { switch (notification) { case WillPaintFlattened: if (m_plugin && m_isInitialized) - m_snapshot = m_plugin->snapshot(); + m_transientPaintingSnapshot = m_plugin->snapshot(); break; case DidPaintFlattened: - m_snapshot = nullptr; + m_transientPaintingSnapshot = nullptr; break; } } @@ -1021,6 +1074,9 @@ void PluginView::invalidateRect(const IntRect& dirtyRect) return; #endif + if (m_pluginElement->displayState() < HTMLPlugInElement::Playing) + return; + RenderBoxModelObject* renderer = toRenderBoxModelObject(m_pluginElement->renderer()); if (!renderer) return; @@ -1176,6 +1232,8 @@ bool PluginView::isAcceleratedCompositingEnabled() if (!settings) return false; + if (m_pluginElement->displayState() < HTMLPlugInElement::Playing) + return false; return settings->acceleratedCompositingEnabled(); } @@ -1364,4 +1422,19 @@ void PluginView::windowedPluginGeometryDidChange(const WebCore::IntRect& frameRe } #endif +void PluginView::pluginSnapshotTimerFired(DeferrableOneShotTimer<PluginView>* timer) +{ + ASSERT_UNUSED(timer, timer == &m_pluginSnapshotTimer); + ASSERT(m_plugin); + + // Snapshot might be 0 if plugin size is 0x0. + RefPtr<ShareableBitmap> snapshot = m_plugin->snapshot(); + RefPtr<Image> snapshotImage; + if (snapshot) + snapshotImage = snapshot->createImage(); + m_pluginElement->updateSnapshot(snapshotImage.release()); + destroyPluginAndReset(); + m_plugin = 0; +} + } // namespace WebKit |