summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-08-25 12:41:57 +0100
committerSteve Block <steveblock@google.com>2011-08-31 14:21:59 +0100
commit5498351dca14a6380ef3174a0afa0bb950b92d68 (patch)
tree99de5978348aa4b62d01cb3443af1b3abacd1de4 /Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp
parentb489cd197be0a820a768f5bafacac9b6cd9cbb1c (diff)
downloadexternal_webkit-5498351dca14a6380ef3174a0afa0bb950b92d68.zip
external_webkit-5498351dca14a6380ef3174a0afa0bb950b92d68.tar.gz
external_webkit-5498351dca14a6380ef3174a0afa0bb950b92d68.tar.bz2
Make sure WebViewClient.onPageStarted() doesn't preceed WebViewClient.shouldOverrideUrlLoading()
In the case of a server-side redirect, we were triggering a callback to WebViewClient.onPageStarted() before we'd called WebViewClient.shouldOverrideUrlLoading(). This change delays calling WebViewClient.onPageStarted() until after WebViewClient.shouldOverrideUrlLoading() has returned and has indicated that the WebView should continue with the load. Bug: 5191031 Change-Id: I43d12c4df46e5d6e2defad10e80efbf0d5c30aed
Diffstat (limited to 'Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp')
-rw-r--r--Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp37
1 files changed, 22 insertions, 15 deletions
diff --git a/Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp b/Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp
index b79b550..9de6c09 100644
--- a/Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp
+++ b/Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp
@@ -95,7 +95,8 @@ FrameLoaderClientAndroid::FrameLoaderClientAndroid(WebFrame* webframe)
, m_webFrame(webframe)
, m_manualLoader(NULL)
, m_hasSentResponseToPlugin(false)
- , m_onDemandPluginsEnabled(false) {
+ , m_onDemandPluginsEnabled(false)
+ , m_didReceiveServerRedirect(false) {
Retain(m_webFrame);
}
@@ -210,9 +211,8 @@ void FrameLoaderClientAndroid::dispatchDidHandleOnloadEvents() {
}
void FrameLoaderClientAndroid::dispatchDidReceiveServerRedirectForProvisionalLoad() {
- ASSERT(m_frame);
- // Tell the load it was a redirect.
- m_webFrame->loadStarted(m_frame);
+ ASSERT(!m_didReceiveServerRedirect);
+ m_didReceiveServerRedirect = true;
}
void FrameLoaderClientAndroid::dispatchDidCancelClientRedirect() {
@@ -768,17 +768,24 @@ bool FrameLoaderClientAndroid::shouldFallBack(const ResourceError&) {
}
bool FrameLoaderClientAndroid::canHandleRequest(const ResourceRequest& request) const {
- ASSERT(m_frame);
- // Don't allow hijacking of intrapage navigation
- if (WebCore::equalIgnoringFragmentIdentifier(request.url(), m_frame->document()->url()))
- return true;
-
- // Don't allow hijacking of iframe urls that are http or https
- if (request.url().protocol().startsWith("http", false) &&
- m_frame->tree() && m_frame->tree()->parent())
- return true;
-
- return m_webFrame->canHandleRequest(request);
+ // This is called by WebCore to determine if this load can be handled by the
+ // WebView. In general, we delegate to the WebFrame, which may ask the
+ // embedding application whether it wishes to hijack the load. However, we
+ // don't allow this if the load is ...
+ // - An intrapage navigation
+ // - An iframe with a HTTP or HTTPS scheme URL
+ bool canHandle = WebCore::equalIgnoringFragmentIdentifier(request.url(), m_frame->document()->url()) ||
+ (request.url().protocol().startsWith("http", false) && m_frame->tree() && m_frame->tree()->parent()) ||
+ m_webFrame->canHandleRequest(request);
+
+ // If this is a server-side redirect and the WebView will handle loading it,
+ // notify the WebFrame, which may notify the embedding application that
+ // we're loading a new URL.
+ if (m_didReceiveServerRedirect && canHandle)
+ m_webFrame->loadStarted(m_frame);
+ m_didReceiveServerRedirect = false;
+
+ return canHandle;
}
bool FrameLoaderClientAndroid::canShowMIMEType(const String& mimeType) const {