diff options
-rw-r--r-- | WebCore/rendering/RenderView.h | 3 | ||||
-rw-r--r-- | WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp | 34 | ||||
-rw-r--r-- | WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h | 3 |
3 files changed, 36 insertions, 4 deletions
diff --git a/WebCore/rendering/RenderView.h b/WebCore/rendering/RenderView.h index c287579..faa2465 100644 --- a/WebCore/rendering/RenderView.h +++ b/WebCore/rendering/RenderView.h @@ -105,6 +105,9 @@ public: void updateWidgetPositions(); void addWidget(RenderWidget*); void removeWidget(RenderWidget*); +#ifdef ANDROID_PLUGINS + const HashSet<RenderWidget*>& widgets() const { return m_widgets; } +#endif // layoutDelta is used transiently during layout to store how far an object has moved from its // last layout location, in order to repaint correctly. diff --git a/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp b/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp index 424617b..9112afe 100644 --- a/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp +++ b/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp @@ -56,6 +56,8 @@ #include "PluginWidget.h" #include "ProgressTracker.h" #include "RenderPart.h" +#include "RenderView.h" +#include "RenderWidget.h" #include "ResourceError.h" #include "ResourceHandle.h" #include "ResourceHandleInternal.h" @@ -84,7 +86,8 @@ FrameLoaderClientAndroid::FrameLoaderClientAndroid(WebFrame* webframe) : m_frame(NULL) , m_webFrame(webframe) , m_manualLoader(NULL) - , m_hasSentResponseToPlugin(false) { + , m_hasSentResponseToPlugin(false) + , m_onDemandPluginsEnabled(false) { Retain(m_webFrame); } @@ -108,6 +111,7 @@ bool FrameLoaderClientAndroid::hasWebView() const { } void FrameLoaderClientAndroid::makeRepresentation(DocumentLoader*) { + m_onDemandPluginsEnabled = false; // don't use representation verifiedOk(); } @@ -1071,6 +1075,29 @@ public: if (event->type() != eventNames().clickEvent) return; + Frame* frame = m_parent->page()->mainFrame(); + while (frame) { + RenderView* view = frame->contentRenderer(); + const HashSet<RenderWidget*> widgets = view->widgets(); + HashSet<RenderWidget*>::const_iterator it = widgets.begin(); + HashSet<RenderWidget*>::const_iterator end = widgets.end(); + for (; it != end; ++it) { + Widget* widget = (*it)->widget(); + // PluginWidget is used only with PluginToggleWidget + if (widget->isPluginWidget()) { + PluginToggleWidget* ptw = + static_cast<PluginToggleWidget*>(widget); + ptw->swapPlugin(*it); + } + } + frame = frame->tree()->traverseNext(); + } + } + + void swapPlugin(RenderWidget* renderer) { + typedef FrameLoaderClientAndroid FLCA; + FLCA* client = static_cast<FLCA*>(m_parent->loader()->client()); + client->enableOnDemandPlugins(); WTF::PassRefPtr<PluginView> prpWidget = PluginView::create(m_parent.get(), m_size, @@ -1081,8 +1108,6 @@ public: m_mimeType, m_loadManually); RefPtr<Widget> myProtector(this); - RenderWidget* renderer = - static_cast<RenderWidget*>(m_element->renderer()); prpWidget->focusPluginElement(); renderer->setWidget(prpWidget); } @@ -1121,7 +1146,8 @@ WTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createPlugin( Settings* settings = m_frame->settings(); // Do the placeholder if plugins are on-demand and there is a plugin for the // given mime type. - if (settings && settings->arePluginsOnDemand() && plugin) { + if (settings && settings->arePluginsOnDemand() && plugin && + !m_onDemandPluginsEnabled) { return adoptRef(new PluginToggleWidget(m_frame, size, element, url, names, values, mimeType, loadManually)); } diff --git a/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h b/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h index 2fb552c..3b754b8 100644 --- a/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h +++ b/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h @@ -208,12 +208,15 @@ namespace android { // FIXME: this doesn't really go here, but it's better than Frame CacheBuilder& getCacheBuilder() { return m_cacheBuilder; } + + void enableOnDemandPlugins() { m_onDemandPluginsEnabled = true; } private: CacheBuilder m_cacheBuilder; Frame* m_frame; WebFrame* m_webFrame; PluginManualLoader* m_manualLoader; bool m_hasSentResponseToPlugin; + bool m_onDemandPluginsEnabled; enum ResourceErrors { InternalErrorCancelled = -99, |