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 | |
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')
24 files changed, 182 insertions, 60 deletions
diff --git a/content/browser/accessibility/accessibility_win_browsertest.cc b/content/browser/accessibility/accessibility_win_browsertest.cc index e5ee763..163ee4c 100644 --- a/content/browser/accessibility/accessibility_win_browsertest.cc +++ b/content/browser/accessibility/accessibility_win_browsertest.cc @@ -108,7 +108,7 @@ IAccessible* AccessibilityWinBrowserTest::GetRendererAccessible() { } void AccessibilityWinBrowserTest::ExecuteScript(const std::wstring& script) { - shell()->web_contents()->GetMainFrame()->ExecuteJavaScript(script); + shell()->web_contents()->GetMainFrame()->ExecuteJavaScriptForTests(script); } // Loads a page with an input text field and places sample text in it. Also, diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc index 80ff6a1..304fc07 100644 --- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc @@ -89,7 +89,7 @@ std::vector<std::string> DumpAccessibilityEventsTest::Dump() { shell(), AccessibilityModeComplete, ui::AX_EVENT_NONE)); - web_contents->GetMainFrame()->ExecuteJavaScript( + web_contents->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16("go()")); // Wait for at least one accessibility event generated in response to 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 diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc index 33296c1..8fd5c50 100644 --- a/content/browser/web_contents/web_contents_android.cc +++ b/content/browser/web_contents/web_contents_android.cc @@ -440,6 +440,39 @@ void WebContentsAndroid::EvaluateJavaScript(JNIEnv* env, ConvertJavaStringToUTF16(env, script), js_callback); } +void WebContentsAndroid::EvaluateJavaScriptForTests(JNIEnv* env, + jobject obj, + jstring script, + jobject callback) { + RenderViewHost* rvh = web_contents_->GetRenderViewHost(); + DCHECK(rvh); + + if (!rvh->IsRenderViewLive()) { + if (!static_cast<WebContentsImpl*>(web_contents_)-> + CreateRenderViewForInitialEmptyDocument()) { + LOG(ERROR) << "Failed to create RenderView in EvaluateJavaScriptForTests"; + return; + } + } + + if (!callback) { + // No callback requested. + web_contents_->GetMainFrame()->ExecuteJavaScriptForTests( + ConvertJavaStringToUTF16(env, script)); + return; + } + + // Secure the Java callback in a scoped object and give ownership of it to the + // base::Callback. + ScopedJavaGlobalRef<jobject> j_callback; + j_callback.Reset(env, callback); + RenderFrameHost::JavaScriptResultCallback js_callback = + base::Bind(&JavaScriptResultCallback, j_callback); + + web_contents_->GetMainFrame()->ExecuteJavaScriptForTests( + ConvertJavaStringToUTF16(env, script), js_callback); +} + void WebContentsAndroid::AddMessageToDevToolsConsole(JNIEnv* env, jobject jobj, jint level, diff --git a/content/browser/web_contents/web_contents_android.h b/content/browser/web_contents/web_contents_android.h index 9eb9238..56e71b8 100644 --- a/content/browser/web_contents/web_contents_android.h +++ b/content/browser/web_contents/web_contents_android.h @@ -86,6 +86,10 @@ class CONTENT_EXPORT WebContentsAndroid jobject obj, jstring script, jobject callback); + void EvaluateJavaScriptForTests(JNIEnv* env, + jobject obj, + jstring script, + jobject callback); void AddMessageToDevToolsConsole(JNIEnv* env, jobject jobj, diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java index d4530f9..0f23bcd 100644 --- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java @@ -293,12 +293,17 @@ import java.util.UUID; } @Override - @VisibleForTesting public void evaluateJavaScript(String script, JavaScriptCallback callback) { nativeEvaluateJavaScript(mNativeWebContentsAndroid, script, callback); } @Override + @VisibleForTesting + public void evaluateJavaScriptForTests(String script, JavaScriptCallback callback) { + nativeEvaluateJavaScriptForTests(mNativeWebContentsAndroid, script, callback); + } + + @Override public void addMessageToDevToolsConsole(int level, String message) { nativeAddMessageToDevToolsConsole(mNativeWebContentsAndroid, level, message); } @@ -421,6 +426,8 @@ import java.util.UUID; private native void nativeResumeLoadingCreatedWebContents(long nativeWebContentsAndroid); private native void nativeEvaluateJavaScript(long nativeWebContentsAndroid, String script, JavaScriptCallback callback); + private native void nativeEvaluateJavaScriptForTests(long nativeWebContentsAndroid, + String script, JavaScriptCallback callback); private native void nativeAddMessageToDevToolsConsole( long nativeWebContentsAndroid, int level, String message); private native boolean nativeHasAccessedInitialDocument( diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java index 5be1f92..5dad2d6 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java @@ -218,16 +218,31 @@ public interface WebContents extends Parcelable { * Injects the passed Javascript code in the current page and evaluates it. * If a result is required, pass in a callback. * + * It is not possible to use this method to evaluate JavaScript on web + * content, only on WebUI pages. + * * @param script The Javascript to execute. * @param callback The callback to be fired off when a result is ready. The script's * result will be json encoded and passed as the parameter, and the call * will be made on the main thread. * If no result is required, pass null. */ - @VisibleForTesting void evaluateJavaScript(String script, JavaScriptCallback callback); /** + * Injects the passed Javascript code in the current page and evaluates it. + * If a result is required, pass in a callback. + * + * @param script The Javascript to execute. + * @param callback The callback to be fired off when a result is ready. The script's + * result will be json encoded and passed as the parameter, and the call + * will be made on the main thread. + * If no result is required, pass null. + */ + @VisibleForTesting + void evaluateJavaScriptForTests(String script, JavaScriptCallback callback); + + /** * Adds a log message to dev tools console. |level| must be a value of * org.chromium.content_public.common.ConsoleMessageLevel. */ diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java index 91d2d04..3d76ef2 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java @@ -45,7 +45,7 @@ public class ContentViewLocationTest extends ContentShellTestBase { } private void pollForPositionCallback() throws Throwable { - mJavascriptHelper.evaluateJavaScript(getWebContents(), + mJavascriptHelper.evaluateJavaScriptForTests(getWebContents(), "positionCount = 0"); mJavascriptHelper.waitUntilHasValue(); assertEquals(0, Integer.parseInt(mJavascriptHelper.getJsonResultAndClear())); @@ -53,7 +53,7 @@ public class ContentViewLocationTest extends ContentShellTestBase { assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { @Override public boolean isSatisfied() { - mJavascriptHelper.evaluateJavaScript(getWebContents(), "positionCount"); + mJavascriptHelper.evaluateJavaScriptForTests(getWebContents(), "positionCount"); try { mJavascriptHelper.waitUntilHasValue(); } catch (Exception e) { @@ -65,7 +65,7 @@ public class ContentViewLocationTest extends ContentShellTestBase { } private void startGeolocationWatchPosition() throws Throwable { - mJavascriptHelper.evaluateJavaScript(getWebContents(), + mJavascriptHelper.evaluateJavaScriptForTests(getWebContents(), "initiate_watchPosition();"); mJavascriptHelper.waitUntilHasValue(); } @@ -116,7 +116,7 @@ public class ContentViewLocationTest extends ContentShellTestBase { hideContentViewOnUiThread(); ensureGeolocationRunning(false); - mJavascriptHelper.evaluateJavaScript(getWebContents(), + mJavascriptHelper.evaluateJavaScriptForTests(getWebContents(), "positionCount = 0"); mJavascriptHelper.waitUntilHasValue(); diff --git a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBareboneTest.java b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBareboneTest.java index 3f2ad52..c835211 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBareboneTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBareboneTest.java @@ -40,7 +40,7 @@ public class JavaBridgeBareboneTest extends ContentShellTestBase { private String evaluateJsSync(String jsCode) throws Exception { OnEvaluateJavaScriptResultHelper javascriptHelper = new OnEvaluateJavaScriptResultHelper(); - javascriptHelper.evaluateJavaScript(getWebContents(), jsCode); + javascriptHelper.evaluateJavaScriptForTests(getWebContents(), jsCode); javascriptHelper.waitUntilHasValue(); return javascriptHelper.getJsonResultAndClear(); } diff --git a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeChildFrameTest.java b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeChildFrameTest.java index 1fda331..fab571f 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeChildFrameTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeChildFrameTest.java @@ -257,7 +257,7 @@ public class JavaBridgeChildFrameTest extends JavaBridgeTestBase { runTestOnUiThread(new Runnable() { @Override public void run() { - webContents.evaluateJavaScript(script, resultCallback); + webContents.evaluateJavaScriptForTests(script, resultCallback); } }); resultCallback.waitForResult(); diff --git a/content/public/android/javatests/src/org/chromium/content/browser/NavigationTest.java b/content/public/android/javatests/src/org/chromium/content/browser/NavigationTest.java index 32d8d24..ae0ab89 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/NavigationTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/NavigationTest.java @@ -118,7 +118,8 @@ public class NavigationTest extends ContentShellTestBase { OnEvaluateJavaScriptResultHelper javascriptHelper = new OnEvaluateJavaScriptResultHelper(); // Grab the first timestamp. - javascriptHelper.evaluateJavaScript(contentViewCore.getWebContents(), "getLoadtime();"); + javascriptHelper.evaluateJavaScriptForTests( + contentViewCore.getWebContents(), "getLoadtime();"); javascriptHelper.waitUntilHasValue(); String firstTimestamp = javascriptHelper.getJsonResultAndClear(); assertNotNull("Timestamp was null.", firstTimestamp); @@ -126,7 +127,8 @@ public class NavigationTest extends ContentShellTestBase { // Grab the timestamp after a reload and make sure they don't match. reload(contentViewCore.getWebContents().getNavigationController(), testCallbackHelperContainer); - javascriptHelper.evaluateJavaScript(contentViewCore.getWebContents(), "getLoadtime();"); + javascriptHelper.evaluateJavaScriptForTests( + contentViewCore.getWebContents(), "getLoadtime();"); javascriptHelper.waitUntilHasValue(); String secondTimestamp = javascriptHelper.getJsonResultAndClear(); assertNotNull("Timestamp was null.", secondTimestamp); diff --git a/content/public/android/javatests/src/org/chromium/content/browser/TestsJavaScriptEvalTest.java b/content/public/android/javatests/src/org/chromium/content/browser/TestsJavaScriptEvalTest.java index 2601348..0eed6b8 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/TestsJavaScriptEvalTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/TestsJavaScriptEvalTest.java @@ -39,7 +39,7 @@ public class TestsJavaScriptEvalTest extends ContentShellTestBase { for (int i = 0; i < 30; ++i) { for (int j = 0; j < 10; ++j) { // Start evaluation of a JavaScript script -- we don't need a result. - webContents.evaluateJavaScript("foobar();", null); + webContents.evaluateJavaScriptForTests("foobar();", null); } // DOMUtils does need to evaluate a JavaScript and get its result to get DOM bounds. assertNotNull("Failed to get bounds", diff --git a/content/public/browser/render_frame_host.h b/content/public/browser/render_frame_host.h index 3097ff1..e47441d 100644 --- a/content/public/browser/render_frame_host.h +++ b/content/public/browser/render_frame_host.h @@ -35,6 +35,11 @@ class CONTENT_EXPORT RenderFrameHost : public IPC::Listener, // Returns nullptr if the IDs do not correspond to a live RenderFrameHost. static RenderFrameHost* FromID(int render_process_id, int render_frame_id); + // Globally allows for injecting JavaScript into the main world. This feature + // is present only to support Android WebView and must not be used in other + // configurations. + static void AllowInjectingJavaScriptForAndroidWebView(); + ~RenderFrameHost() override {} // Returns the route id for this frame. @@ -74,17 +79,24 @@ class CONTENT_EXPORT RenderFrameHost : public IPC::Listener, // Runs some JavaScript in this frame's context. If a callback is provided, it // will be used to return the result, when the result is available. + // This API can only be called on chrome:// or chrome-devtools:// URLs. typedef base::Callback<void(const base::Value*)> JavaScriptResultCallback; virtual void ExecuteJavaScript(const base::string16& javascript) = 0; virtual void ExecuteJavaScript(const base::string16& javascript, const JavaScriptResultCallback& callback) = 0; + + // Runs some JavaScript in an isolated world of top of this frame's context. virtual void ExecuteJavaScriptInIsolatedWorld( const base::string16& javascript, const JavaScriptResultCallback& callback, int world_id) = 0; - // ONLY FOR TESTS: Same as above but adds a fake UserGestureIndicator around - // execution. (crbug.com/408426) + // ONLY FOR TESTS: Same as above but without restrictions. Optionally, adds a + // fake UserGestureIndicator around execution. (crbug.com/408426) + virtual void ExecuteJavaScriptForTests(const base::string16& javascript) = 0; + virtual void ExecuteJavaScriptForTests( + const base::string16& javascript, + const JavaScriptResultCallback& callback) = 0; virtual void ExecuteJavaScriptWithUserGestureForTests( const base::string16& javascript) = 0; diff --git a/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/JavaScriptUtils.java b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/JavaScriptUtils.java index 42457cc..75cd2e9 100644 --- a/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/JavaScriptUtils.java +++ b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/JavaScriptUtils.java @@ -50,7 +50,7 @@ public class JavaScriptUtils { ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { - helper.evaluateJavaScript(webContents, code); + helper.evaluateJavaScriptForTests(webContents, code); } }); helper.waitUntilHasValue(timeout, timeoutUnits); @@ -65,7 +65,7 @@ public class JavaScriptUtils { ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { - webContents.evaluateJavaScript(code, null); + webContents.evaluateJavaScriptForTests(code, null); } }); } diff --git a/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/TestCallbackHelperContainer.java b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/TestCallbackHelperContainer.java index cfc53ff..d97e1ef 100644 --- a/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/TestCallbackHelperContainer.java +++ b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/TestCallbackHelperContainer.java @@ -126,7 +126,7 @@ public class TestCallbackHelperContainer { * @param webContents A WebContents instance to be used. * @param code A JavaScript code to be evaluated. */ - public void evaluateJavaScript(WebContents webContents, String code) { + public void evaluateJavaScriptForTests(WebContents webContents, String code) { JavaScriptCallback callback = new JavaScriptCallback() { @Override @@ -134,12 +134,12 @@ public class TestCallbackHelperContainer { notifyCalled(jsonResult); } }; - webContents.evaluateJavaScript(code, callback); + webContents.evaluateJavaScriptForTests(code, callback); mJsonResult = null; } /** - * Returns true if the evaluation started by evaluateJavaScript() has completed. + * Returns true if the evaluation started by evaluateJavaScriptForTests() has completed. */ public boolean hasValue() { return mJsonResult != null; diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index 8f491ba..1f7d78a 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc @@ -145,7 +145,7 @@ WebLocalFrame* RenderViewTest::GetMainFrame() { return view_->GetWebView()->mainFrame()->toWebLocalFrame(); } -void RenderViewTest::ExecuteJavaScript(const char* js) { +void RenderViewTest::ExecuteJavaScriptForTests(const char* js) { GetMainFrame()->executeScript(WebScriptSource(WebString::fromUTF8(js))); } diff --git a/content/public/test/render_view_test.h b/content/public/test/render_view_test.h index 36ca0be..ba225d5 100644 --- a/content/public/test/render_view_test.h +++ b/content/public/test/render_view_test.h @@ -73,7 +73,7 @@ class RenderViewTest : public testing::Test { // Executes the given JavaScript in the context of the main frame. The input // is a NULL-terminated UTF-8 string. - void ExecuteJavaScript(const char* js); + void ExecuteJavaScriptForTests(const char* js); // Executes the given JavaScript and sets the int value it evaluates to in // |result|. diff --git a/content/public/test/test_utils.cc b/content/public/test/test_utils.cc index 4293f39..8158eee 100644 --- a/content/public/test/test_utils.cc +++ b/content/public/test/test_utils.cc @@ -175,7 +175,7 @@ scoped_ptr<base::Value> ExecuteScriptAndGetValue( RenderFrameHost* render_frame_host, const std::string& script) { ScriptCallback observer; - render_frame_host->ExecuteJavaScript( + render_frame_host->ExecuteJavaScriptForTests( base::UTF8ToUTF16(script), base::Bind(&ScriptCallback::ResultCallback, base::Unretained(&observer))); base::MessageLoop* loop = base::MessageLoop::current(); diff --git a/content/renderer/accessibility/renderer_accessibility_browsertest.cc b/content/renderer/accessibility/renderer_accessibility_browsertest.cc index 0053bcc..1c5c7bd 100644 --- a/content/renderer/accessibility/renderer_accessibility_browsertest.cc +++ b/content/renderer/accessibility/renderer_accessibility_browsertest.cc @@ -248,10 +248,10 @@ TEST_F(RendererAccessibilityTest, HideAccessibilityObject) { WebAXObject node_c = node_b.childAt(0); // Hide node 'B' ('C' stays visible). - ExecuteJavaScript( + ExecuteJavaScriptForTests( "document.getElementById('B').style.visibility = 'hidden';"); // Force layout now. - ExecuteJavaScript("document.getElementById('B').offsetLeft;"); + ExecuteJavaScriptForTests("document.getElementById('B').offsetLeft;"); // Send a childrenChanged on 'A'. sink_->ClearMessages(); @@ -294,9 +294,9 @@ TEST_F(RendererAccessibilityTest, ShowAccessibilityObject) { EXPECT_EQ(3, CountAccessibilityNodesSentToBrowser()); // Show node 'B', then send a childrenChanged on 'A'. - ExecuteJavaScript( + ExecuteJavaScriptForTests( "document.getElementById('B').style.visibility = 'visible';"); - ExecuteJavaScript("document.getElementById('B').offsetLeft;"); + ExecuteJavaScriptForTests("document.getElementById('B').offsetLeft;"); sink_->ClearMessages(); WebDocument document = view()->GetWebView()->mainFrame()->document(); @@ -355,10 +355,10 @@ TEST_F(RendererAccessibilityTest, DetachAccessibilityObject) { // Change the display of the second 'span' back to inline, which causes the // anonymous block to be destroyed. - ExecuteJavaScript( + ExecuteJavaScriptForTests( "document.querySelectorAll('span')[1].style.display = 'inline';"); // Force layout now. - ExecuteJavaScript("document.body.offsetLeft;"); + ExecuteJavaScriptForTests("document.body.offsetLeft;"); // Send a childrenChanged on the body. sink_->ClearMessages(); diff --git a/content/renderer/devtools/v8_sampling_profiler_browsertest.cc b/content/renderer/devtools/v8_sampling_profiler_browsertest.cc index aacd305..db3c8d5 100644 --- a/content/renderer/devtools/v8_sampling_profiler_browsertest.cc +++ b/content/renderer/devtools/v8_sampling_profiler_browsertest.cc @@ -30,7 +30,7 @@ class V8SamplingProfilerTest : public RenderViewTest { RenderViewTest::TearDown(); } - void KickV8() { ExecuteJavaScript("1"); } + void KickV8() { ExecuteJavaScriptForTests("1"); } void SyncFlush(TraceLog* trace_log) { base::WaitableEvent flush_complete_event(false, false); diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 44fbc19..658fb84 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc @@ -427,7 +427,8 @@ TEST_F(RenderViewImplTest, DISABLED_OnNavStateChanged) { // Change the value of the input. We should have gotten an update state // notification. We need to spin the message loop to catch this update. - ExecuteJavaScript("document.getElementById('elt_text').value = 'foo';"); + ExecuteJavaScriptForTests( + "document.getElementById('elt_text').value = 'foo';"); ProcessPendingMessages(); EXPECT_TRUE(render_thread_->sink().GetUniqueMessageMatching( ViewHostMsg_UpdateState::ID)); @@ -963,7 +964,7 @@ TEST_F(RenderViewImplTest, OnImeTypeChanged) { for (int i = 0; i < kRepeatCount; i++) { // Move the input focus to the first <input> element, where we should // activate IMEs. - ExecuteJavaScript("document.getElementById('test1').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test1').focus();"); ProcessPendingMessages(); render_thread_->sink().ClearMessages(); @@ -983,7 +984,7 @@ TEST_F(RenderViewImplTest, OnImeTypeChanged) { // Move the input focus to the second <input> element, where we should // de-activate IMEs. - ExecuteJavaScript("document.getElementById('test2').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test2').focus();"); ProcessPendingMessages(); render_thread_->sink().ClearMessages(); @@ -1033,7 +1034,7 @@ TEST_F(RenderViewImplTest, OnImeTypeChanged) { // the window focus while composing a CJK text. To handle such complicated // cases, this test should not only call IME-related functions in the // RenderWidget class, but also call some RenderWidget members, e.g. -// ExecuteJavaScript(), RenderWidget::OnSetFocus(), etc. +// ExecuteJavaScriptForTests(), RenderWidget::OnSetFocus(), etc. TEST_F(RenderViewImplTest, ImeComposition) { enum ImeCommand { IME_INITIALIZE, @@ -1108,7 +1109,7 @@ TEST_F(RenderViewImplTest, ImeComposition) { "<div id=\"test1\" contenteditable=\"true\"></div>" "</body>" "</html>"); - ExecuteJavaScript("document.getElementById('test1').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test1').focus();"); break; case IME_SETINPUTMODE: @@ -1186,17 +1187,18 @@ TEST_F(RenderViewImplTest, OnSetTextDirection) { }; for (size_t i = 0; i < arraysize(kTextDirection); ++i) { // Set the text direction of the <textarea> element. - ExecuteJavaScript("document.getElementById('test').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test').focus();"); view()->OnSetTextDirection(kTextDirection[i].direction); // Write the values of its DOM 'dir' attribute and its CSS 'direction' // property to the <div> element. - ExecuteJavaScript("var result = document.getElementById('result');" - "var node = document.getElementById('test');" - "var style = getComputedStyle(node, null);" - "result.innerText =" - " node.getAttribute('dir') + ',' +" - " style.getPropertyValue('direction');"); + ExecuteJavaScriptForTests( + "var result = document.getElementById('result');" + "var node = document.getElementById('test');" + "var style = getComputedStyle(node, null);" + "result.innerText =" + " node.getAttribute('dir') + ',' +" + " style.getPropertyValue('direction');"); // Copy the document content to std::wstring and compare with the // expected result. @@ -1248,7 +1250,7 @@ TEST_F(RenderViewImplTest, OnHandleKeyboardEvent) { "</div>" "</body>" "</html>"); - ExecuteJavaScript("document.getElementById('test').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test').focus();"); render_thread_->sink().ClearMessages(); static const MockKeyboard::Layout kLayouts[] = { @@ -1515,7 +1517,7 @@ TEST_F(RenderViewImplTest, MAYBE_InsertCharacters) { "</div>" "</body>" "</html>"); - ExecuteJavaScript("document.getElementById('test').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test').focus();"); render_thread_->sink().ClearMessages(); // For each key code, we send three keyboard events. @@ -1741,7 +1743,7 @@ TEST_F(RenderViewImplTest, GetCompositionCharacterBoundsTest) { #endif LoadHTML("<textarea id=\"test\"></textarea>"); - ExecuteJavaScript("document.getElementById('test').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test').focus();"); const base::string16 empty_string; const std::vector<blink::WebCompositionUnderline> empty_underline; @@ -1843,7 +1845,7 @@ TEST_F(RenderViewImplTest, SetEditableSelectionAndComposition) { "<input id=\"test1\" value=\"some test text hello\"></input>" "</body>" "</html>"); - ExecuteJavaScript("document.getElementById('test1').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test1').focus();"); frame()->SetEditableSelectionOffsets(4, 8); const std::vector<blink::WebCompositionUnderline> empty_underline; frame()->SetCompositionFromExistingText(7, 10, empty_underline); @@ -1868,7 +1870,7 @@ TEST_F(RenderViewImplTest, OnExtendSelectionAndDelete) { "<input id=\"test1\" value=\"abcdefghijklmnopqrstuvwxyz\"></input>" "</body>" "</html>"); - ExecuteJavaScript("document.getElementById('test1').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test1').focus();"); frame()->SetEditableSelectionOffsets(10, 10); frame()->ExtendSelectionAndDelete(3, 4); blink::WebTextInputInfo info = view()->webview()->textInputInfo(); @@ -1941,7 +1943,7 @@ TEST_F(RenderViewImplTest, MessageOrderInDidChangeSelection) { LoadHTML("<textarea id=\"test\"></textarea>"); view()->handling_input_event_ = true; - ExecuteJavaScript("document.getElementById('test').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test').focus();"); bool is_input_type_called = false; bool is_selection_called = false; @@ -2129,7 +2131,7 @@ TEST_F(RenderViewImplTest, FocusElementCallsFocusedNodeChanged) { LoadHTML("<input id='test1' value='hello1'></input>" "<input id='test2' value='hello2'></input>"); - ExecuteJavaScript("document.getElementById('test1').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test1').focus();"); const IPC::Message* msg1 = render_thread_->sink().GetFirstMessageMatching( ViewHostMsg_FocusedNodeChanged::ID); EXPECT_TRUE(msg1); @@ -2139,7 +2141,7 @@ TEST_F(RenderViewImplTest, FocusElementCallsFocusedNodeChanged) { EXPECT_TRUE(base::get<0>(params)); render_thread_->sink().ClearMessages(); - ExecuteJavaScript("document.getElementById('test2').focus();"); + ExecuteJavaScriptForTests("document.getElementById('test2').focus();"); const IPC::Message* msg2 = render_thread_->sink().GetFirstMessageMatching( ViewHostMsg_FocusedNodeChanged::ID); EXPECT_TRUE(msg2); @@ -2354,7 +2356,7 @@ TEST_F(DevToolsAgentTest, DevToolsResumeOnClose) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&DevToolsAgentTest::CloseWhilePaused, base::Unretained(this))); - ExecuteJavaScript("debugger;"); + ExecuteJavaScriptForTests("debugger;"); // CloseWhilePaused should resume execution and continue here. EXPECT_FALSE(IsPaused()); diff --git a/content/renderer/render_view_browsertest_mac.mm b/content/renderer/render_view_browsertest_mac.mm index 6730da7..a973c31 100644 --- a/content/renderer/render_view_browsertest_mac.mm +++ b/content/renderer/render_view_browsertest_mac.mm @@ -103,7 +103,7 @@ TEST_F(RenderViewTest, MacTestCmdUp) { EditCommands(1, EditCommand("moveToEndOfDocument", ""))); SendNativeKeyEvent(NativeWebKeyboardEvent(arrowDownKeyDown)); ProcessPendingMessages(); - ExecuteJavaScript("scroll.textContent = window.pageYOffset"); + ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset"); output = GetMainFrame()->contentAsText(kMaxOutputCharacters); EXPECT_EQ(kArrowDownScrollDown, base::UTF16ToASCII(output)); @@ -112,21 +112,21 @@ TEST_F(RenderViewTest, MacTestCmdUp) { EditCommands(1, EditCommand("moveToBeginningOfDocument", ""))); SendNativeKeyEvent(NativeWebKeyboardEvent(arrowUpKeyDown)); ProcessPendingMessages(); - ExecuteJavaScript("scroll.textContent = window.pageYOffset"); + ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset"); output = GetMainFrame()->contentAsText(kMaxOutputCharacters); EXPECT_EQ(kArrowUpScrollUp, base::UTF16ToASCII(output)); // Now let javascript eat the key events -- no scrolling should happen. // Set a scroll position slightly down the page to ensure that it does not // move. - ExecuteJavaScript("allowKeyEvents = false; window.scrollTo(0, 100)"); + ExecuteJavaScriptForTests("allowKeyEvents = false; window.scrollTo(0, 100)"); const char* kArrowDownNoScroll = "40,false,false,true,false\n100\np1"; view->OnSetEditCommandsForNextKeyEvent( EditCommands(1, EditCommand("moveToEndOfDocument", ""))); SendNativeKeyEvent(NativeWebKeyboardEvent(arrowDownKeyDown)); ProcessPendingMessages(); - ExecuteJavaScript("scroll.textContent = window.pageYOffset"); + ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset"); output = GetMainFrame()->contentAsText(kMaxOutputCharacters); EXPECT_EQ(kArrowDownNoScroll, base::UTF16ToASCII(output)); @@ -135,7 +135,7 @@ TEST_F(RenderViewTest, MacTestCmdUp) { EditCommands(1, EditCommand("moveToBeginningOfDocument", ""))); SendNativeKeyEvent(NativeWebKeyboardEvent(arrowUpKeyDown)); ProcessPendingMessages(); - ExecuteJavaScript("scroll.textContent = window.pageYOffset"); + ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset"); output = GetMainFrame()->contentAsText(kMaxOutputCharacters); EXPECT_EQ(kArrowUpNoScroll, base::UTF16ToASCII(output)); } diff --git a/content/shell/browser/shell_devtools_frontend.cc b/content/shell/browser/shell_devtools_frontend.cc index 4facf23..69300f6 100644 --- a/content/shell/browser/shell_devtools_frontend.cc +++ b/content/shell/browser/shell_devtools_frontend.cc @@ -194,7 +194,7 @@ void ShellDevToolsFrontend::HandleMessageFromDevToolsFrontend( params->GetSize() == 1 && params->GetString(0, &browser_message)) { agent_host_->DispatchProtocolMessage(browser_message); } else if (method == "loadCompleted") { - web_contents()->GetMainFrame()->ExecuteJavaScript( + web_contents()->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16("DevToolsAPI.setUseSoftMenu(true);")); } else if (method == "loadNetworkResource" && params->GetSize() == 3) { // TODO(pfeldman): handle some of the embedder messages in content. @@ -261,7 +261,7 @@ void ShellDevToolsFrontend::DispatchProtocolMessage( if (message.length() < kMaxMessageChunkSize) { base::string16 javascript = base::UTF8ToUTF16( "DevToolsAPI.dispatchMessage(" + message + ");"); - web_contents()->GetMainFrame()->ExecuteJavaScript(javascript); + web_contents()->GetMainFrame()->ExecuteJavaScriptForTests(javascript); return; } @@ -272,7 +272,7 @@ void ShellDevToolsFrontend::DispatchProtocolMessage( base::StringValue(message.substr(pos, kMaxMessageChunkSize)), ¶m); std::string code = "DevToolsAPI.dispatchMessageChunk(" + param + ");"; base::string16 javascript = base::UTF8ToUTF16(code); - web_contents()->GetMainFrame()->ExecuteJavaScript(javascript); + web_contents()->GetMainFrame()->ExecuteJavaScriptForTests(javascript); } } @@ -320,7 +320,7 @@ void ShellDevToolsFrontend::CallClientFunction( } } javascript.append(");"); - web_contents()->GetMainFrame()->ExecuteJavaScript( + web_contents()->GetMainFrame()->ExecuteJavaScriptForTests( base::UTF8ToUTF16(javascript)); } |