summaryrefslogtreecommitdiffstats
path: root/content/browser/frame_host
diff options
context:
space:
mode:
authorJochen Eisinger <jochen@chromium.org>2015-07-24 14:04:37 +0200
committerJochen Eisinger <jochen@chromium.org>2015-07-24 12:05:37 +0000
commit14ea977ff2e300fd131d3ca8ff6f5311f5fd1df8 (patch)
tree349a54560a08376a79c57549f7146519f2289ec5 /content/browser/frame_host
parent89c4fe5484963e9d658d4aaabd597b3221d21dbf (diff)
downloadchromium_src-14ea977ff2e300fd131d3ca8ff6f5311f5fd1df8.zip
chromium_src-14ea977ff2e300fd131d3ca8ff6f5311f5fd1df8.tar.gz
chromium_src-14ea977ff2e300fd131d3ca8ff6f5311f5fd1df8.tar.bz2
Reland "Add ExecuteJavaScriptForTest and make all tests use it"
Original issue's description: > Additionally, restrict the URLs that ExecuteJavaScript can be invoked on > to chrome-controlled URLs. > > R=jam@chromium.org > BUG=507809 > > Review URL: https://codereview.chromium.org/1123783002 > > Cr-Commit-Position: refs/heads/master@{#340231} R=mkwst@chromium.org TBR=jam@chromium.org BUG=507809 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Review URL: https://codereview.chromium.org/1258593002 . Cr-Commit-Position: refs/heads/master@{#340260}
Diffstat (limited to 'content/browser/frame_host')
-rw-r--r--content/browser/frame_host/render_frame_host_impl.cc40
-rw-r--r--content/browser/frame_host/render_frame_host_impl.h7
2 files changed, 47 insertions, 0 deletions
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 81aa7c3..c7314b4 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -92,6 +92,10 @@ int g_next_accessibility_reset_token = 1;
// The next value to use for the javascript callback id.
int g_next_javascript_callback_id = 1;
+// Whether to allow injecting javascript into any kind of frame (for Android
+// WebView).
+bool g_allow_injecting_javascript = false;
+
// The (process id, routing id) pair that identifies one RenderFrame.
typedef std::pair<int32, int32> RenderFrameHostID;
typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*>
@@ -127,6 +131,11 @@ RenderFrameHost* RenderFrameHost::FromID(int render_process_id,
}
// static
+void RenderFrameHost::AllowInjectingJavaScriptForAndroidWebView() {
+ g_allow_injecting_javascript = true;
+}
+
+// static
RenderFrameHostImpl* RenderFrameHostImpl::FromID(int process_id,
int routing_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -272,6 +281,7 @@ void RenderFrameHostImpl::AddMessageToConsole(ConsoleMessageLevel level,
void RenderFrameHostImpl::ExecuteJavaScript(
const base::string16& javascript) {
+ CHECK(CanExecuteJavaScript());
Send(new FrameMsg_JavaScriptExecuteRequest(routing_id_,
javascript,
0, false));
@@ -280,6 +290,7 @@ void RenderFrameHostImpl::ExecuteJavaScript(
void RenderFrameHostImpl::ExecuteJavaScript(
const base::string16& javascript,
const JavaScriptResultCallback& callback) {
+ CHECK(CanExecuteJavaScript());
int key = g_next_javascript_callback_id++;
Send(new FrameMsg_JavaScriptExecuteRequest(routing_id_,
javascript,
@@ -287,6 +298,23 @@ void RenderFrameHostImpl::ExecuteJavaScript(
javascript_callbacks_.insert(std::make_pair(key, callback));
}
+void RenderFrameHostImpl::ExecuteJavaScriptForTests(
+ const base::string16& javascript) {
+ Send(new FrameMsg_JavaScriptExecuteRequestForTests(routing_id_,
+ javascript,
+ 0, false, false));
+}
+
+void RenderFrameHostImpl::ExecuteJavaScriptForTests(
+ const base::string16& javascript,
+ const JavaScriptResultCallback& callback) {
+ int key = g_next_javascript_callback_id++;
+ Send(new FrameMsg_JavaScriptExecuteRequestForTests(routing_id_, javascript,
+ key, true, false));
+ javascript_callbacks_.insert(std::make_pair(key, callback));
+}
+
+
void RenderFrameHostImpl::ExecuteJavaScriptWithUserGestureForTests(
const base::string16& javascript) {
Send(new FrameMsg_JavaScriptExecuteRequestForTests(routing_id_,
@@ -2132,4 +2160,16 @@ void RenderFrameHostImpl::UpdatePermissionsForNavigation(
}
}
+bool RenderFrameHostImpl::CanExecuteJavaScript() {
+ return g_allow_injecting_javascript ||
+ frame_tree_node_->current_url().SchemeIs(kChromeDevToolsScheme) ||
+ ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
+ GetProcess()->GetID()) ||
+ // It's possible to load about:blank in a Web UI renderer.
+ // See http://crbug.com/42547
+ (frame_tree_node_->current_url().spec() == url::kAboutBlankURL) ||
+ // InterstitialPageImpl should be the only case matching this.
+ (delegate_->GetAsWebContents() == nullptr);
+}
+
} // namespace content
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 8035992..b4e9442 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -139,6 +139,10 @@ class CONTENT_EXPORT RenderFrameHostImpl
void ExecuteJavaScript(const base::string16& javascript) override;
void ExecuteJavaScript(const base::string16& javascript,
const JavaScriptResultCallback& callback) override;
+ void ExecuteJavaScriptForTests(const base::string16& javascript) override;
+ void ExecuteJavaScriptForTests(
+ const base::string16& javascript,
+ const JavaScriptResultCallback& callback) override;
void ExecuteJavaScriptWithUserGestureForTests(
const base::string16& javascript) override;
void ExecuteJavaScriptInIsolatedWorld(
@@ -584,6 +588,9 @@ class CONTENT_EXPORT RenderFrameHostImpl
const CommonNavigationParams& common_params,
const RequestNavigationParams& request_params);
+ // Returns true if the ExecuteJavaScript() API can be used on this host.
+ bool CanExecuteJavaScript();
+
// For now, RenderFrameHosts indirectly keep RenderViewHosts alive via a
// refcount that calls Shutdown when it reaches zero. This allows each
// RenderFrameHostManager to just care about RenderFrameHosts, while ensuring