diff options
author | cdn@chromium.org <cdn@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-08 19:57:44 +0000 |
---|---|---|
committer | cdn@chromium.org <cdn@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-08 19:57:44 +0000 |
commit | e1ed5a188df5935630e7597824db03cc9d19caba (patch) | |
tree | df99e5c3ebadddadf117863ce5798d1df5946d07 | |
parent | a418c46fa5883c274b3a349b2f2f8627026a875f (diff) | |
download | chromium_src-e1ed5a188df5935630e7597824db03cc9d19caba.zip chromium_src-e1ed5a188df5935630e7597824db03cc9d19caba.tar.gz chromium_src-e1ed5a188df5935630e7597824db03cc9d19caba.tar.bz2 |
Base web accessibility decisions on page transition. We only need to perform the check if the transition is web triggerable.
BUG=137435
TEST=ExtensionResourceRequestPolicyTest.WebAccessibleResources
Review URL: https://chromiumcodereview.appspot.com/10827107
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@150606 0039d316-1c4b-4281-b951-d872f2087c98
13 files changed, 94 insertions, 30 deletions
diff --git a/chrome/browser/extensions/extension_resource_request_policy_apitest.cc b/chrome/browser/extensions/extension_resource_request_policy_apitest.cc index bf65432..37d78cf 100644 --- a/chrome/browser/extensions/extension_resource_request_policy_apitest.cc +++ b/chrome/browser/extensions/extension_resource_request_policy_apitest.cc @@ -206,6 +206,20 @@ IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, L"window.domAutomationController.send(document.title)", &result)); EXPECT_EQ("Loading CER:// failed.", result); + + GURL newtab_page("chrome://newtab"); + GURL accessible_newtab_override( + test_server()->GetURL( + "files/extensions/api_test/extension_resource_request_policy/" + "web_accessible/accessible_history_navigation.html")); + ui_test_utils::NavigateToURL(browser(), newtab_page); + ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( + browser(), accessible_newtab_override, 2); + ASSERT_TRUE(content::ExecuteJavaScriptAndExtractString( + chrome::GetActiveWebContents(browser())->GetRenderViewHost(), L"", + L"window.domAutomationController.send(document.title)", + &result)); + EXPECT_EQ("New Tab Page Loaded Successfully", result); } IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest, diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index bbcf00f..eb549e2 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc @@ -5,6 +5,7 @@ #include "chrome/renderer/chrome_content_renderer_client.h" #include <string> +#include <vector> #include "base/command_line.h" #include "base/logging.h" @@ -777,14 +778,16 @@ bool ChromeContentRendererClient::ShouldFork(WebFrame* frame, } bool ChromeContentRendererClient::WillSendRequest(WebKit::WebFrame* frame, - const GURL& url, - GURL* new_url) { + content::PageTransition transition_type, + const GURL& url, + GURL* new_url) { // Check whether the request should be allowed. If not allowed, we reset the // URL to something invalid to prevent the request and cause an error. if (url.SchemeIs(chrome::kExtensionScheme) && !extensions::ResourceRequestPolicy::CanRequestResource( url, frame, + transition_type, extension_dispatcher_->extensions())) { *new_url = GURL("chrome-extension://invalid/"); return true; diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h index f8e977f..c1abf0f 100644 --- a/chrome/renderer/chrome_content_renderer_client.h +++ b/chrome/renderer/chrome_content_renderer_client.h @@ -90,6 +90,7 @@ class ChromeContentRendererClient : public content::ContentRendererClient { bool is_initial_navigation, bool* send_referrer) OVERRIDE; virtual bool WillSendRequest(WebKit::WebFrame* frame, + content::PageTransition transition_type, const GURL& url, GURL* new_url) OVERRIDE; virtual bool ShouldPumpEventsDuringCookieMessage() OVERRIDE; diff --git a/chrome/renderer/extensions/resource_request_policy.cc b/chrome/renderer/extensions/resource_request_policy.cc index ae45672..c9973c8 100644 --- a/chrome/renderer/extensions/resource_request_policy.cc +++ b/chrome/renderer/extensions/resource_request_policy.cc @@ -11,6 +11,7 @@ #include "chrome/common/url_constants.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension_set.h" +#include "content/public/common/page_transition_types.h" #include "googleurl/src/gurl.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" @@ -23,6 +24,7 @@ namespace extensions { bool ResourceRequestPolicy::CanRequestResource( const GURL& resource_url, WebKit::WebFrame* frame, + content::PageTransition transition_type, const ExtensionSet* loaded_extensions) { CHECK(resource_url.SchemeIs(chrome::kExtensionScheme)); @@ -66,8 +68,11 @@ bool ResourceRequestPolicy::CanRequestResource( // to support the devtools extension APIs) bool is_dev_tools = page_url.SchemeIs(chrome::kChromeDevToolsScheme) && !extension->devtools_url().is_empty(); + bool transition_allowed = + !content::PageTransitionIsWebTriggerable(transition_type); - if (!is_empty_origin && !is_own_resource && !is_dev_tools) { + if (!is_empty_origin && !is_own_resource && + !is_dev_tools && !transition_allowed) { std::string message = base::StringPrintf( "Denying load of %s. Resources must be listed in the " "web_accessible_resources manifest key in order to be loaded by " diff --git a/chrome/renderer/extensions/resource_request_policy.h b/chrome/renderer/extensions/resource_request_policy.h index 0308ecb..c5f95f7 100644 --- a/chrome/renderer/extensions/resource_request_policy.h +++ b/chrome/renderer/extensions/resource_request_policy.h @@ -5,6 +5,8 @@ #ifndef CHROME_RENDERER_EXTENSIONS_RESOURCE_REQUEST_POLICY_H_ #define CHROME_RENDERER_EXTENSIONS_RESOURCE_REQUEST_POLICY_H_ +#include "content/public/common/page_transition_types.h" + class ExtensionSet; class GURL; @@ -19,9 +21,12 @@ namespace extensions { class ResourceRequestPolicy { public: // Returns true if the chrome-extension:// |resource_url| can be requested - // from |frame_url|. + // from |frame_url|. In some cases this decision is made based upon how + // this request was generated. Web triggered transitions are more restrictive + // than those triggered through UI. static bool CanRequestResource(const GURL& resource_url, WebKit::WebFrame* frame, + content::PageTransition transition_type, const ExtensionSet* loaded_extensions); // Returns true if the chrome-extension-resource:// |resource_url| can be // requested from |frame_url|. diff --git a/chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/accessible_history_navigation.html b/chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/accessible_history_navigation.html new file mode 100644 index 0000000..7b259e7 --- /dev/null +++ b/chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/accessible_history_navigation.html @@ -0,0 +1,12 @@ +<html> +<head> + <title>New Tab Page Load Failed</title> + <script> + function test() { + history.back(); + } + </script> +</head> +<body onload="test()"> +</body> +</html> diff --git a/chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/manifest.json b/chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/manifest.json index c69c40f..b3ffc03 100644 --- a/chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/manifest.json +++ b/chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/manifest.json @@ -1,10 +1,13 @@ -{
- "manifest_version": 2,
- "name": "web_accessible",
- "version": "0.1",
- "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPOziAf8MbTjdUo6DysZ4nAU/2f/kwYnftyKkxI1GyTlbStprGy+Y2ek4/59QbE3xEE+dIIuYeObM4QTptpcFMg956ZLFoeDg41Pg3tzUrbltgG8hXTbBxN852FJx2kdaqa/MKUUsJKGSD5hkUmvZRADGGWhMWzvz64ao1h02xJQIDAQAD",
- "web_accessible_resources": [
- "test.png",
- "nonexistent.png"
- ]
-}
+{ + "manifest_version": 2, + "name": "web_accessible", + "version": "0.1", + "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPOziAf8MbTjdUo6DysZ4nAU/2f/kwYnftyKkxI1GyTlbStprGy+Y2ek4/59QbE3xEE+dIIuYeObM4QTptpcFMg956ZLFoeDg41Pg3tzUrbltgG8hXTbBxN852FJx2kdaqa/MKUUsJKGSD5hkUmvZRADGGWhMWzvz64ao1h02xJQIDAQAD", + "web_accessible_resources": [ + "test.png", + "nonexistent.png" + ], + "chrome_url_overrides": { + "newtab": "newtab_override.html" + } +} diff --git a/chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/newtab_override.html b/chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/newtab_override.html new file mode 100644 index 0000000..a79f231 --- /dev/null +++ b/chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/newtab_override.html @@ -0,0 +1,5 @@ +<html> +<head> + <title>New Tab Page Loaded Successfully</title> +</head> +</html> diff --git a/content/public/common/page_transition_types.cc b/content/public/common/page_transition_types.cc index 711e0fb..bc6b197 100644 --- a/content/public/common/page_transition_types.cc +++ b/content/public/common/page_transition_types.cc @@ -42,6 +42,14 @@ int32 PageTransitionGetQualifier(PageTransition type) { return type & PAGE_TRANSITION_QUALIFIER_MASK; } +bool PageTransitionIsWebTriggerable(PageTransition type) { + int32 t = PageTransitionStripQualifier(type); + return (t == PAGE_TRANSITION_LINK || + t == PAGE_TRANSITION_AUTO_SUBFRAME || + t == PAGE_TRANSITION_MANUAL_SUBFRAME || + t == PAGE_TRANSITION_FORM_SUBMIT); +} + const char* PageTransitionGetCoreTransitionString(PageTransition type) { switch (type & PAGE_TRANSITION_CORE_MASK) { case PAGE_TRANSITION_LINK: return "link"; diff --git a/content/public/common/page_transition_types.h b/content/public/common/page_transition_types.h index 683f347..14e80a6 100644 --- a/content/public/common/page_transition_types.h +++ b/content/public/common/page_transition_types.h @@ -149,6 +149,10 @@ CONTENT_EXPORT bool PageTransitionIsRedirect(PageTransition type); // Return the qualifier CONTENT_EXPORT int32 PageTransitionGetQualifier(PageTransition type); +// Returns true if the transition can be triggered by the web instead of +// through UI or similar. +CONTENT_EXPORT bool PageTransitionIsWebTriggerable(PageTransition type); + // Return a string version of the core type values. CONTENT_EXPORT const char* PageTransitionGetCoreTransitionString( PageTransition type); diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc index 09dd455..502b6b8 100644 --- a/content/public/renderer/content_renderer_client.cc +++ b/content/public/renderer/content_renderer_client.cc @@ -63,9 +63,11 @@ bool ContentRendererClient::ShouldFork(WebKit::WebFrame* frame, return false; } -bool ContentRendererClient::WillSendRequest(WebKit::WebFrame* frame, - const GURL& url, - GURL* new_url) { +bool ContentRendererClient::WillSendRequest( + WebKit::WebFrame* frame, + PageTransition transition_type, + const GURL& url, + GURL* new_url) { return false; } diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h index f0c1a93..e91470a 100644 --- a/content/public/renderer/content_renderer_client.h +++ b/content/public/renderer/content_renderer_client.h @@ -11,6 +11,7 @@ #include "base/memory/weak_ptr.h" #include "ipc/ipc_message.h" #include "content/public/common/content_client.h" +#include "content/public/common/page_transition_types.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPageVisibilityState.h" #include "v8/include/v8.h" @@ -138,6 +139,7 @@ class CONTENT_EXPORT ContentRendererClient { // Notifies the embedder that the given frame is requesting the resource at // |url|. If the function returns true, the url is changed to |new_url|. virtual bool WillSendRequest(WebKit::WebFrame* frame, + PageTransition transition_type, const GURL& url, GURL* new_url); diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 1605624..3c15266 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -1301,9 +1301,9 @@ void RenderViewImpl::OnSelectRange(const gfx::Point& start, void RenderViewImpl::OnSetHistoryLengthAndPrune(int history_length, int32 minimum_page_id) { - DCHECK(history_length >= 0); + DCHECK_GE(history_length, 0); DCHECK(history_list_offset_ == history_list_length_ - 1); - DCHECK(minimum_page_id >= -1); + DCHECK_GE(minimum_page_id, -1); // Generate the new list. std::vector<int32> new_history_page_ids(history_length, -1); @@ -2803,10 +2803,10 @@ void RenderViewImpl::didCreateDataSource(WebFrame* frame, WebDataSource* ds) { // The rest of RenderView assumes that a WebDataSource will always have a // non-null NavigationState. - if (content_initiated) + if (content_initiated) { document_state->set_navigation_state( NavigationState::CreateContentInitiated()); - else { + } else { document_state->set_navigation_state(CreateNavigationStateFromPending()); pending_navigation_params_.reset(); } @@ -2940,7 +2940,7 @@ void RenderViewImpl::ProcessViewLayoutFlags(const CommandLine& command_line) { int width, height; if (base::StringToInt(tokens[0], &width) && base::StringToInt(tokens[1], &height)) - webview()->setFixedLayoutSize(WebSize(width,height)); + webview()->setFixedLayoutSize(WebSize(width, height)); } } } @@ -3320,20 +3320,21 @@ void RenderViewImpl::willSendRequest(WebFrame* frame, WebDataSource* data_source = provisional_data_source ? provisional_data_source : top_data_source; + content::PageTransition transition_type = content::PAGE_TRANSITION_LINK; + DocumentState* document_state = DocumentState::FromDataSource(data_source); + DCHECK(document_state); + NavigationState* navigation_state = document_state->navigation_state(); + transition_type = navigation_state->transition_type(); + GURL request_url(request.url()); GURL new_url; if (content::GetContentClient()->renderer()->WillSendRequest( - frame, request_url, &new_url)) { + frame, transition_type, request_url, &new_url)) { request.setURL(WebURL(new_url)); } - content::PageTransition transition_type = content::PAGE_TRANSITION_LINK; - DocumentState* document_state = DocumentState::FromDataSource(data_source); - DCHECK(document_state); - NavigationState* navigation_state = document_state->navigation_state(); if (document_state->is_cache_policy_override_set()) request.setCachePolicy(document_state->cache_policy_override()); - transition_type = navigation_state->transition_type(); WebKit::WebReferrerPolicy referrer_policy; if (document_state && document_state->is_referrer_policy_set()) { @@ -4545,7 +4546,7 @@ void RenderViewImpl::OnScriptEvalRequest(const string16& frame_xpath, void RenderViewImpl::OnPostMessageEvent( const ViewMsg_PostMessage_Params& params) { // TODO(creis): Support sending to subframes. - WebFrame *frame = webview()->mainFrame(); + WebFrame* frame = webview()->mainFrame(); // Find the source frame if it exists. // TODO(creis): Support source subframes. @@ -5301,7 +5302,6 @@ void RenderViewImpl::OnSetFocus(bool enable) { #endif (*plugin_it)->SetContentAreaFocus(enable); } - } // Notify all Pepper plugins. pepper_delegate_.OnSetFocus(enable); |