summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcdn@chromium.org <cdn@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-08 19:57:44 +0000
committercdn@chromium.org <cdn@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-08 19:57:44 +0000
commite1ed5a188df5935630e7597824db03cc9d19caba (patch)
treedf99e5c3ebadddadf117863ce5798d1df5946d07
parenta418c46fa5883c274b3a349b2f2f8627026a875f (diff)
downloadchromium_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
-rw-r--r--chrome/browser/extensions/extension_resource_request_policy_apitest.cc14
-rw-r--r--chrome/renderer/chrome_content_renderer_client.cc7
-rw-r--r--chrome/renderer/chrome_content_renderer_client.h1
-rw-r--r--chrome/renderer/extensions/resource_request_policy.cc7
-rw-r--r--chrome/renderer/extensions/resource_request_policy.h7
-rw-r--r--chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/accessible_history_navigation.html12
-rw-r--r--chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/manifest.json23
-rw-r--r--chrome/test/data/extensions/api_test/extension_resource_request_policy/web_accessible/newtab_override.html5
-rw-r--r--content/public/common/page_transition_types.cc8
-rw-r--r--content/public/common/page_transition_types.h4
-rw-r--r--content/public/renderer/content_renderer_client.cc8
-rw-r--r--content/public/renderer/content_renderer_client.h2
-rw-r--r--content/renderer/render_view_impl.cc26
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);