diff options
author | joi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-07 18:37:45 +0000 |
---|---|---|
committer | joi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-07 18:37:45 +0000 |
commit | 8079b36066fdbd24978e01fcce4c9c44a5470748 (patch) | |
tree | a7802a790b66edbe86789a0f2a208020be384958 /chrome/renderer | |
parent | ce45c3e6da5a0412cb84c37d662f177a42a442cb (diff) | |
download | chromium_src-8079b36066fdbd24978e01fcce4c9c44a5470748.zip chromium_src-8079b36066fdbd24978e01fcce4c9c44a5470748.tar.gz chromium_src-8079b36066fdbd24978e01fcce4c9c44a5470748.tar.bz2 |
Allow stand-alone extension views (e.g. browser action pop-ups) to reload
themselves, navigate to other pages in the same extension, persist their
state using # after the URL, etc.
TEST=write an extension that reloads its page action pop-up (e.g. on a button click), see that before this change it does not work, after it does
BUG=none
Review URL: http://codereview.chromium.org/1947002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@46721 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/render_view.cc | 24 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 10 |
2 files changed, 20 insertions, 14 deletions
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index f2bd227..86076d5 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -2253,7 +2253,8 @@ WebNavigationPolicy RenderView::decidePolicyForNavigation( // If the browser is interested, then give it a chance to look at top level // navigations. - if (ShouldRouteNavigationToBrowser(url, frame, type)) { + if (renderer_preferences_.browser_handles_top_level_requests && + IsNonLocalTopLevelNavigation(url, frame, type)) { last_top_level_navigation_page_id_ = page_id_; GURL referrer(request.httpHeaderField(WebString::fromUTF8("Referer"))); OpenURL(url, referrer, default_policy); @@ -2277,13 +2278,23 @@ WebNavigationPolicy RenderView::decidePolicyForNavigation( // punt them up to the browser to handle. if (CrossesExtensionExtents(frame, url) || BindingsPolicy::is_dom_ui_enabled(enabled_bindings_) || - BindingsPolicy::is_extension_enabled(enabled_bindings_) || frame->isViewSourceModeEnabled() || url.SchemeIs(chrome::kViewSourceScheme) || url.SchemeIs(chrome::kPrintScheme)) { OpenURL(url, GURL(), default_policy); return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. } + + // We forward navigations from extensions to the browser if they are + // top-level events, even if the browser hasn't expressed interest. + // + // Note that we've already forwarded cross-extension extents navigations + // above. + if (BindingsPolicy::is_extension_enabled(enabled_bindings_) && + IsNonLocalTopLevelNavigation(url, frame, type)) { + OpenURL(url, GURL(), default_policy); + return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. + } } // Detect when a page is "forking" a new tab that can be safely rendered in @@ -4958,14 +4969,9 @@ WebKit::WebGeolocationService* RenderView::geolocationService() { return geolocation_dispatcher_.get(); } -bool RenderView::ShouldRouteNavigationToBrowser( +bool RenderView::IsNonLocalTopLevelNavigation( const GURL& url, WebKit::WebFrame* frame, WebKit::WebNavigationType type) { - // If the browser is interested, then give it a chance to look at top level - // navigations - if (!renderer_preferences_.browser_handles_top_level_requests) - return false; - - // Must be a top level frame. + // Must be a top level frame. if (frame->parent() != NULL) return false; diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index bc68296..bcf9f0a 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -922,11 +922,11 @@ class RenderView : public RenderWidget, // Should only be called if this object wraps a PluginDocument. webkit_glue::WebPluginDelegate* GetDelegateForPluginDocument(); - // Returns true if the navigation attempt is to be routed to the - // browser. - bool ShouldRouteNavigationToBrowser(const GURL& url, - WebKit::WebFrame* frame, - WebKit::WebNavigationType type); + // Returns false unless this is a top-level navigation that + // crosses origins. + bool IsNonLocalTopLevelNavigation(const GURL& url, + WebKit::WebFrame* frame, + WebKit::WebNavigationType type); // Bitwise-ORed set of extra bindings that have been enabled. See // BindingsPolicy for details. |