summaryrefslogtreecommitdiff
path: root/Source/WebKit2/WebProcess/Plugins/PluginView.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-10-15 16:08:57 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-15 16:08:57 +0200
commit5466563f4b5b6b86523e3f89bb7f77e5b5270c78 (patch)
tree8caccf7cd03a15207cde3ba282c88bf132482a91 /Source/WebKit2/WebProcess/Plugins/PluginView.cpp
parent33b26980cb24288b5a9f2590ccf32a949281bb79 (diff)
downloadqtwebkit-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.cpp99
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