summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorjoi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-07 18:37:45 +0000
committerjoi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-07 18:37:45 +0000
commit8079b36066fdbd24978e01fcce4c9c44a5470748 (patch)
treea7802a790b66edbe86789a0f2a208020be384958 /chrome/renderer
parentce45c3e6da5a0412cb84c37d662f177a42a442cb (diff)
downloadchromium_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.cc24
-rw-r--r--chrome/renderer/render_view.h10
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.