diff options
author | Jochen Eisinger <jochen@chromium.org> | 2015-07-24 14:04:37 +0200 |
---|---|---|
committer | Jochen Eisinger <jochen@chromium.org> | 2015-07-24 12:05:37 +0000 |
commit | 14ea977ff2e300fd131d3ca8ff6f5311f5fd1df8 (patch) | |
tree | 349a54560a08376a79c57549f7146519f2289ec5 /content/browser/frame_host | |
parent | 89c4fe5484963e9d658d4aaabd597b3221d21dbf (diff) | |
download | chromium_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.cc | 40 | ||||
-rw-r--r-- | content/browser/frame_host/render_frame_host_impl.h | 7 |
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 |