diff options
| author | Steve Block <steveblock@google.com> | 2011-08-25 12:41:57 +0100 |
|---|---|---|
| committer | Steve Block <steveblock@google.com> | 2011-08-31 14:21:59 +0100 |
| commit | 5498351dca14a6380ef3174a0afa0bb950b92d68 (patch) | |
| tree | 99de5978348aa4b62d01cb3443af1b3abacd1de4 /Source/WebKit/android/WebCoreSupport | |
| parent | b489cd197be0a820a768f5bafacac9b6cd9cbb1c (diff) | |
| download | external_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')
| -rw-r--r-- | Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp | 37 | ||||
| -rw-r--r-- | Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h | 11 |
2 files changed, 28 insertions, 20 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 { diff --git a/Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h b/Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h index e325e01..2464c58 100644 --- a/Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h +++ b/Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.h @@ -229,12 +229,13 @@ namespace android { virtual void didSaveToPageCache() { } virtual void didRestoreFromPageCache() { } private: - CacheBuilder m_cacheBuilder; - Frame* m_frame; - WebFrame* m_webFrame; + CacheBuilder m_cacheBuilder; + Frame* m_frame; + WebFrame* m_webFrame; PluginManualLoader* m_manualLoader; - bool m_hasSentResponseToPlugin; - bool m_onDemandPluginsEnabled; + bool m_hasSentResponseToPlugin; + bool m_onDemandPluginsEnabled; + mutable bool m_didReceiveServerRedirect; enum ResourceErrors { InternalErrorCancelled = -99, |
