summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WebCore/rendering/RenderView.h3
-rw-r--r--WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp34
-rw-r--r--WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h3
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,