summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WebCore/loader/EmptyClients.h4
-rw-r--r--WebCore/loader/FrameLoader.cpp8
-rw-r--r--WebCore/page/Chrome.cpp7
-rw-r--r--WebCore/page/Chrome.h4
-rw-r--r--WebCore/page/ChromeClient.h4
-rw-r--r--WebCore/page/Frame.cpp6
-rw-r--r--WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp11
-rw-r--r--WebKit/android/WebCoreSupport/ChromeClientAndroid.h4
8 files changed, 47 insertions, 1 deletions
diff --git a/WebCore/loader/EmptyClients.h b/WebCore/loader/EmptyClients.h
index 44fad72..b4952b1 100644
--- a/WebCore/loader/EmptyClients.h
+++ b/WebCore/loader/EmptyClients.h
@@ -70,7 +70,11 @@ public:
virtual float scaleFactor() { return 1.f; }
+#ifdef ANDROID_USER_GESTURE
+ virtual void focus(bool userGesture) { }
+#else
virtual void focus() { }
+#endif
virtual void unfocus() { }
virtual bool canTakeFocus(FocusDirection) { return false; }
diff --git a/WebCore/loader/FrameLoader.cpp b/WebCore/loader/FrameLoader.cpp
index 80fcff8..f9dc2bf 100644
--- a/WebCore/loader/FrameLoader.cpp
+++ b/WebCore/loader/FrameLoader.cpp
@@ -262,7 +262,11 @@ Frame* FrameLoader::createWindow(FrameLoader* frameLoaderForFrameLookup, const F
if (!request.resourceRequest().url().isEmpty())
frame->loader()->loadFrameRequest(request, false, false, 0, 0, SendReferrer);
if (Page* page = frame->page())
+#ifdef ANDROID_USER_GESTURE
+ page->chrome()->focus(isProcessingUserGesture());
+#else
page->chrome()->focus();
+#endif
created = false;
return frame;
}
@@ -1882,7 +1886,11 @@ void FrameLoader::loadFrameRequest(const FrameLoadRequest& request, bool lockHis
Frame* targetFrame = sourceFrame->loader()->findFrameForNavigation(request.frameName());
if (targetFrame && targetFrame != sourceFrame) {
if (Page* page = targetFrame->page())
+#ifdef ANDROID_USER_GESTURE
+ page->chrome()->focus(request.resourceRequest().getUserGesture());
+#else
page->chrome()->focus();
+#endif
}
}
diff --git a/WebCore/page/Chrome.cpp b/WebCore/page/Chrome.cpp
index 96f0fb7..7e14b3e 100644
--- a/WebCore/page/Chrome.cpp
+++ b/WebCore/page/Chrome.cpp
@@ -127,10 +127,17 @@ float Chrome::scaleFactor()
return m_client->scaleFactor();
}
+#ifdef ANDROID_USER_GESTURE
+void Chrome::focus(bool userGesture) const
+{
+ m_client->focus(userGesture);
+}
+#else
void Chrome::focus() const
{
m_client->focus();
}
+#endif
void Chrome::unfocus() const
{
diff --git a/WebCore/page/Chrome.h b/WebCore/page/Chrome.h
index 033311d..c562f33 100644
--- a/WebCore/page/Chrome.h
+++ b/WebCore/page/Chrome.h
@@ -76,7 +76,11 @@ namespace WebCore {
float scaleFactor();
+#ifdef ANDROID_USER_GESTURE
+ void focus(bool userGesture) const;
+#else
void focus() const;
+#endif
void unfocus() const;
bool canTakeFocus(FocusDirection) const;
diff --git a/WebCore/page/ChromeClient.h b/WebCore/page/ChromeClient.h
index 5231603..194f855 100644
--- a/WebCore/page/ChromeClient.h
+++ b/WebCore/page/ChromeClient.h
@@ -77,7 +77,11 @@ namespace WebCore {
virtual float scaleFactor() = 0;
+#ifdef ANDROID_USER_GESTURE
+ virtual void focus(bool userGesture) = 0;
+#else
virtual void focus() = 0;
+#endif
virtual void unfocus() = 0;
virtual bool canTakeFocus(FocusDirection) = 0;
diff --git a/WebCore/page/Frame.cpp b/WebCore/page/Frame.cpp
index afda0b9..dac6553 100644
--- a/WebCore/page/Frame.cpp
+++ b/WebCore/page/Frame.cpp
@@ -1665,7 +1665,13 @@ void Frame::focusWindow()
// If we're a top level window, bring the window to the front.
if (!tree()->parent())
+#ifdef ANDROID_USER_GESTURE
+ // FrameLoader::isProcessingUserGesture() will be false when a
+ // different frame tries to focus this frame through javascript.
+ page()->chrome()->focus(m_loader.isProcessingUserGesture());
+#else
page()->chrome()->focus();
+#endif
eventHandler()->focusDocumentView();
}
diff --git a/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp b/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
index cfac25e..f441aa1 100644
--- a/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
+++ b/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
@@ -105,10 +105,19 @@ float ChromeClientAndroid::scaleFactor()
return 1.0f;
}
+#ifdef ANDROID_USER_GESTURE
+void ChromeClientAndroid::focus(bool userGesture) {
+#else
void ChromeClientAndroid::focus() {
+ // The old behavior was to always allow javascript to focus a window. If we
+ // turn off ANDROID_USER_GESTURE, go back to the old behavior by forcing
+ // userGesture to be true.
+ bool userGesture = true;
+#endif
ASSERT(m_webFrame);
// Ask the application to focus this WebView.
- m_webFrame->requestFocus();
+ if (userGesture)
+ m_webFrame->requestFocus();
}
void ChromeClientAndroid::unfocus() { notImplemented(); }
diff --git a/WebKit/android/WebCoreSupport/ChromeClientAndroid.h b/WebKit/android/WebCoreSupport/ChromeClientAndroid.h
index 7bd7088..5ed785a 100644
--- a/WebKit/android/WebCoreSupport/ChromeClientAndroid.h
+++ b/WebKit/android/WebCoreSupport/ChromeClientAndroid.h
@@ -53,7 +53,11 @@ namespace android {
virtual float scaleFactor();
+#ifdef ANDROID_USER_GESTURE
+ virtual void focus(bool userGesture);
+#else
virtual void focus();
+#endif
virtual void unfocus();
virtual bool canTakeFocus(FocusDirection);