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 | |
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}
62 files changed, 305 insertions, 150 deletions
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc index 85fa1ea..4c28f14 100644 --- a/android_webview/browser/aw_browser_main_parts.cc +++ b/android_webview/browser/aw_browser_main_parts.cc @@ -19,6 +19,7 @@ #include "base/files/file_path.h" #include "base/path_service.h" #include "content/public/browser/android/synchronous_compositor.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/common/content_client.h" #include "content/public/common/content_switches.h" @@ -118,6 +119,8 @@ void AwBrowserMainParts::PreMainMessageLoopRun() { gfx::GLSurface::InitializeOneOff(); } + content::RenderFrameHost::AllowInjectingJavaScriptForAndroidWebView(); + // This is needed for WebView Classic backwards compatibility // See crbug.com/298495 content::SetMaxURLChars(20 * 1024 * 1024); diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 3b7a165..8874bd7 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java @@ -2069,6 +2069,22 @@ public class AwContents implements SmartClipProvider, mWebContents.evaluateJavaScript(script, jsCallback); } + public void evaluateJavaScriptForTests(String script, final ValueCallback<String> callback) { + if (TRACE) Log.d(TAG, "evaluateJavascriptForTests=" + script); + if (isDestroyed()) return; + JavaScriptCallback jsCallback = null; + if (callback != null) { + jsCallback = new JavaScriptCallback() { + @Override + public void handleJavaScriptResult(String jsonResult) { + callback.onReceiveValue(jsonResult); + } + }; + } + + mWebContents.evaluateJavaScriptForTests(script, jsCallback); + } + /** * Post a message to a frame. * diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java index 5c9b9c5..6906936 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java @@ -403,7 +403,7 @@ public class AwContentsTest extends AwTestBase { AwSettings awSettings = awContents.getSettings(); awSettings.setJavaScriptEnabled(true); awContents.addJavascriptInterface(new JavaScriptObject(callback), "bridge"); - awContents.evaluateJavaScript("window.bridge.run();", null); + awContents.evaluateJavaScriptForTests("window.bridge.run();", null); } }); callback.waitForCallback(0, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwJavaBridgeTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwJavaBridgeTest.java index 10a4974..cfc3fe8 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwJavaBridgeTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwJavaBridgeTest.java @@ -70,7 +70,7 @@ public class AwJavaBridgeTest extends AwTestBase { assertEquals("\"function\"", executeJavaScriptAndWaitForResult( awContents, mContentsClient, "typeof test.destroy")); int currentCallCount = client2.getOnPageFinishedHelper().getCallCount(); - awContents.evaluateJavaScript("test.destroy()", null); + awContents.evaluateJavaScriptForTests("test.destroy()", null); client2.getOnPageFinishedHelper().waitForCallback(currentCallCount); } diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java index 11eb3c5..dec1762 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java @@ -588,7 +588,7 @@ public class AwTestBase TestAwContentsClient.OnCreateWindowHelper onCreateWindowHelper = parentAwContentsClient.getOnCreateWindowHelper(); int currentCallCount = onCreateWindowHelper.getCallCount(); - parentAwContents.evaluateJavaScript(triggerScript, null); + parentAwContents.evaluateJavaScriptForTests(triggerScript, null); onCreateWindowHelper.waitForCallback( currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS); } diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java index 98f45f7..23beb13 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java @@ -113,7 +113,7 @@ public class GeolocationTest extends AwTestBase { loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), RAW_HTML, "text/html", false); - mAwContents.evaluateJavaScript("initiate_getCurrentPosition();", null); + mAwContents.evaluateJavaScriptForTests("initiate_getCurrentPosition();", null); poll(new Callable<Boolean>() { @Override @@ -122,7 +122,7 @@ public class GeolocationTest extends AwTestBase { } }); - mAwContents.evaluateJavaScript("initiate_getCurrentPosition();", null); + mAwContents.evaluateJavaScriptForTests("initiate_getCurrentPosition();", null); poll(new Callable<Boolean>() { @Override public Boolean call() throws Exception { @@ -140,7 +140,7 @@ public class GeolocationTest extends AwTestBase { loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), RAW_HTML, "text/html", false); - mAwContents.evaluateJavaScript("initiate_watchPosition();", null); + mAwContents.evaluateJavaScriptForTests("initiate_watchPosition();", null); poll(new Callable<Boolean>() { @Override @@ -157,7 +157,7 @@ public class GeolocationTest extends AwTestBase { loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), RAW_HTML, "text/html", false); - mAwContents.evaluateJavaScript("initiate_watchPosition();", null); + mAwContents.evaluateJavaScriptForTests("initiate_watchPosition();", null); poll(new Callable<Boolean>() { @Override @@ -215,7 +215,7 @@ public class GeolocationTest extends AwTestBase { loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), RAW_HTML, "text/html", false); - mAwContents.evaluateJavaScript("initiate_watchPosition();", null); + mAwContents.evaluateJavaScriptForTests("initiate_watchPosition();", null); assertEquals(0, getPositionCountFromJS()); diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java b/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java index 5f2b6ab..c522fa80 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java @@ -47,7 +47,7 @@ public class JSUtils { testCase.getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { - awContents.getWebContents().evaluateJavaScript( + awContents.getWebContents().evaluateJavaScriptForTests( "var evObj = document.createEvent('Events'); " + "evObj.initEvent('click', true, false); " + "document.getElementById('" + linkId + "').dispatchEvent(evObj);" @@ -65,7 +65,7 @@ public class JSUtils { testCase.getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { - onEvaluateJavaScriptResultHelper.evaluateJavaScript( + onEvaluateJavaScriptResultHelper.evaluateJavaScriptForTests( awContents.getWebContents(), code); } }); diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/JavaScriptEvalChromeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/JavaScriptEvalChromeTest.java index ca686b8..9581ec6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/JavaScriptEvalChromeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/JavaScriptEvalChromeTest.java @@ -55,8 +55,8 @@ public class JavaScriptEvalChromeTest extends ChromeTabbedActivityTestBase { for (int i = 1; i <= 30; ++i) { for (int j = 0; j < 5; ++j) { // Start evaluation of a JavaScript script -- we don't need a result. - tab1.getWebContents().evaluateJavaScript("foobar();", null); - tab2.getWebContents().evaluateJavaScript("foobar();", null); + tab1.getWebContents().evaluateJavaScriptForTests("foobar();", null); + tab2.getWebContents().evaluateJavaScriptForTests("foobar();", null); } assertEquals("Incorrect JavaScript evaluation result on tab1", i * 2, @@ -65,8 +65,8 @@ public class JavaScriptEvalChromeTest extends ChromeTabbedActivityTestBase { tab1.getWebContents(), "add2()"))); for (int j = 0; j < 5; ++j) { // Start evaluation of a JavaScript script -- we don't need a result. - tab1.getWebContents().evaluateJavaScript("foobar();", null); - tab2.getWebContents().evaluateJavaScript("foobar();", null); + tab1.getWebContents().evaluateJavaScriptForTests("foobar();", null); + tab2.getWebContents().evaluateJavaScriptForTests("foobar();", null); } assertEquals("Incorrect JavaScript evaluation result on tab2", i * 2 + 1, diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ModalDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ModalDialogTest.java index 7cffc5b..e7ccc6e0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ModalDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ModalDialogTest.java @@ -264,7 +264,8 @@ public class ModalDialogTest extends ChromeActivityTestCaseBase<ChromeActivity> clickCancel(jsDialog); scriptEvent.waitUntilHasValue(); - scriptEvent.evaluateJavaScript(getActivity().getCurrentContentViewCore().getWebContents(), + scriptEvent.evaluateJavaScriptForTests( + getActivity().getCurrentContentViewCore().getWebContents(), "alert('Android');"); assertTrue("No further dialog boxes should be shown.", scriptEvent.waitUntilHasValue()); } @@ -310,7 +311,8 @@ public class ModalDialogTest extends ChromeActivityTestCaseBase<ChromeActivity> private OnEvaluateJavaScriptResultHelper executeJavaScriptAndWaitForDialog( final OnEvaluateJavaScriptResultHelper helper, String script) throws InterruptedException { - helper.evaluateJavaScript(getActivity().getCurrentContentViewCore().getWebContents(), + helper.evaluateJavaScriptForTests( + getActivity().getCurrentContentViewCore().getWebContents(), script); boolean criteriaSatisfied = CriteriaHelper.pollForCriteria( new JavascriptAppModalDialogShownCriteria(true)); diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java index 091a7b5..be59db6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java @@ -133,7 +133,7 @@ public class TabsTest extends ChromeTabbedActivityTestBase { ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { - tab.getWebContents().evaluateJavaScript( + tab.getWebContents().evaluateJavaScriptForTests( "(function() {" + " window.open('www.google.com');" + "})()", @@ -158,7 +158,7 @@ public class TabsTest extends ChromeTabbedActivityTestBase { ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { - tab.getWebContents().evaluateJavaScript( + tab.getWebContents().evaluateJavaScriptForTests( "(function() {" + " alert('hi');" + "})()", diff --git a/chrome/browser/apps/custom_launcher_page_browsertest_views.cc b/chrome/browser/apps/custom_launcher_page_browsertest_views.cc index f39ec2e..eb8aea1 100644 --- a/chrome/browser/apps/custom_launcher_page_browsertest_views.cc +++ b/chrome/browser/apps/custom_launcher_page_browsertest_views.cc @@ -113,8 +113,8 @@ class CustomLauncherPageBrowserTest enabled ? "launcherPageEnabled" : "launcherPageDisabled"; ExtensionTestMessageListener listener(test_message, false); - custom_page_frame->ExecuteJavaScript(enabled ? kLauncherPageEnableScript - : kLauncherPageDisableScript); + custom_page_frame->ExecuteJavaScriptForTests( + enabled ? kLauncherPageEnableScript : kLauncherPageDisableScript); listener.WaitUntilSatisfied(); } @@ -339,7 +339,7 @@ IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest, LauncherPageShowAndHide) { // if the app launcher is already showing. { ExtensionTestMessageListener listener("onPageProgressAt1", false); - custom_page_frame->ExecuteJavaScript(kLauncherPageShowScript); + custom_page_frame->ExecuteJavaScriptForTests(kLauncherPageShowScript); listener.WaitUntilSatisfied(); EXPECT_TRUE(contents_view->IsStateActive( @@ -353,7 +353,7 @@ IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest, LauncherPageShowAndHide) { app_list_view->GetWidget()->Close(); ExtensionTestMessageListener listener("onPageProgressAt1", false); - custom_page_frame->ExecuteJavaScript(kLauncherPageShowScript); + custom_page_frame->ExecuteJavaScriptForTests(kLauncherPageShowScript); listener.WaitUntilSatisfied(); @@ -367,7 +367,7 @@ IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest, LauncherPageShowAndHide) { // Ensure launcherPage.hide() hides the launcher page when it's showing. { ExtensionTestMessageListener listener("onPageProgressAt0", false); - custom_page_frame->ExecuteJavaScript(kLauncherPageHideScript); + custom_page_frame->ExecuteJavaScriptForTests(kLauncherPageHideScript); listener.WaitUntilSatisfied(); @@ -380,7 +380,7 @@ IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest, LauncherPageShowAndHide) { contents_view->SetActiveState(app_list::AppListModel::STATE_APPS, false); ExtensionTestMessageListener listener("launcherPageHidden", false); - custom_page_frame->ExecuteJavaScript(kLauncherPageHideScript); + custom_page_frame->ExecuteJavaScriptForTests(kLauncherPageHideScript); listener.WaitUntilSatisfied(); EXPECT_TRUE( diff --git a/chrome/browser/chromeos/login/lock/screen_locker_tester.cc b/chrome/browser/chromeos/login/lock/screen_locker_tester.cc index 37efe02..c3fc29b 100644 --- a/chrome/browser/chromeos/login/lock/screen_locker_tester.cc +++ b/chrome/browser/chromeos/login/lock/screen_locker_tester.cc @@ -118,7 +118,7 @@ class WebUIScreenLockerTester : public ScreenLockerTester { }; void WebUIScreenLockerTester::SetPassword(const std::string& password) { - webui()->GetWebContents()->GetMainFrame()->ExecuteJavaScript( + webui()->GetWebContents()->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16(base::StringPrintf( "$('pod-row').pods[0].passwordElement.value = '%s';", password.c_str()))); diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc index 3f59c51..d73dc34 100644 --- a/chrome/browser/download/download_browsertest.cc +++ b/chrome/browser/download/download_browsertest.cc @@ -2237,7 +2237,8 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, SavePageNonHTMLViaPost) { &web_contents->GetController())); content::RenderFrameHost* render_frame_host = web_contents->GetMainFrame(); ASSERT_TRUE(render_frame_host != NULL); - render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16("SubmitForm()")); + render_frame_host->ExecuteJavaScriptForTests( + base::ASCIIToUTF16("SubmitForm()")); observer.Wait(); EXPECT_EQ(jpeg_url, web_contents->GetURL()); diff --git a/chrome/browser/errorpage_browsertest.cc b/chrome/browser/errorpage_browsertest.cc index f89164b..9f1dc79 100644 --- a/chrome/browser/errorpage_browsertest.cc +++ b/chrome/browser/errorpage_browsertest.cc @@ -621,7 +621,7 @@ IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_DoSearch) { // Can't use content::ExecuteScript because it waits for scripts to send // notification that they've run, and scripts that trigger a navigation may // not send that notification. - web_contents->GetMainFrame()->ExecuteJavaScript( + web_contents->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16("document.getElementById('search-button').click();")); nav_observer.Wait(); EXPECT_EQ(base::ASCIIToUTF16("Title Of More Awesomeness"), @@ -666,7 +666,7 @@ IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_DoReload) { // Can't use content::ExecuteScript because it waits for scripts to send // notification that they've run, and scripts that trigger a navigation may // not send that notification. - web_contents->GetMainFrame()->ExecuteJavaScript( + web_contents->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16("document.getElementById('reload-button').click();")); nav_observer.Wait(); ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); @@ -699,12 +699,12 @@ IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_DoClickLink) { "document.querySelector('a[href=\"http://mock.http/title2.html\"]')"; // The tracking request is triggered by onmousedown, so it catches middle // mouse button clicks, as well as left clicks. - web_contents->GetMainFrame()->ExecuteJavaScript( + web_contents->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16(link_selector + ".onmousedown();")); // Can't use content::ExecuteScript because it waits for scripts to send // notification that they've run, and scripts that trigger a navigation may // not send that notification. - web_contents->GetMainFrame()->ExecuteJavaScript( + web_contents->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16(link_selector + ".click();")); EXPECT_EQ(base::ASCIIToUTF16("Title Of Awesomeness"), title_watcher.WaitAndGetTitle()); @@ -790,7 +790,7 @@ IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_JavaScript) { content::WindowedNotificationObserver load_observer( content::NOTIFICATION_LOAD_STOP, content::Source<NavigationController>(&wc->GetController())); - wc->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16(script)); + wc->GetMainFrame()->ExecuteJavaScriptForTests(base::ASCIIToUTF16(script)); load_observer.Wait(); // Ensure we saw the expected failure. @@ -810,7 +810,7 @@ IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_JavaScript) { content::WindowedNotificationObserver load_observer( content::NOTIFICATION_LOAD_STOP, content::Source<NavigationController>(&wc->GetController())); - wc->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16(script)); + wc->GetMainFrame()->ExecuteJavaScriptForTests(base::ASCIIToUTF16(script)); load_observer.Wait(); } @@ -821,7 +821,7 @@ IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_JavaScript) { content::WindowedNotificationObserver load_observer( content::NOTIFICATION_LOAD_STOP, content::Source<NavigationController>(&wc->GetController())); - wc->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16(script)); + wc->GetMainFrame()->ExecuteJavaScriptForTests(base::ASCIIToUTF16(script)); load_observer.Wait(); EXPECT_EQ(fail_url, fail_observer.fail_url()); @@ -1000,7 +1000,7 @@ IN_PROC_BROWSER_TEST_F(ErrorPageAutoReloadTest, ManualReloadNotSuppressed) { content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); content::TestNavigationObserver nav_observer(web_contents, 1); - web_contents->GetMainFrame()->ExecuteJavaScript( + web_contents->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16("document.getElementById('reload-button').click();")); nav_observer.Wait(); EXPECT_FALSE(IsDisplayingText(browser(), "error.page.auto.reload")); diff --git a/chrome/browser/extensions/alert_apitest.cc b/chrome/browser/extensions/alert_apitest.cc index 9aece03..753f149 100644 --- a/chrome/browser/extensions/alert_apitest.cc +++ b/chrome/browser/extensions/alert_apitest.cc @@ -21,7 +21,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, AlertBasic) { extensions::ProcessManager::Get(browser()->profile()) ->GetBackgroundHostForExtension(extension->id()); ASSERT_TRUE(host); - host->host_contents()->GetMainFrame()->ExecuteJavaScript( + host->host_contents()->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16("alert('This should not crash.');")); app_modal::AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); diff --git a/chrome/browser/extensions/api/media_galleries/media_galleries_watch_apitest.cc b/chrome/browser/extensions/api/media_galleries/media_galleries_watch_apitest.cc index 1f8e767..617247f 100644 --- a/chrome/browser/extensions/api/media_galleries/media_galleries_watch_apitest.cc +++ b/chrome/browser/extensions/api/media_galleries/media_galleries_watch_apitest.cc @@ -108,7 +108,7 @@ class MediaGalleriesGalleryWatchApiTest : public ExtensionApiTest { void ExecuteCmdAndCheckReply(const std::string& js_command, const std::string& ok_message) { ExtensionTestMessageListener listener(ok_message, false); - background_host_->GetMainFrame()->ExecuteJavaScript( + background_host_->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16(js_command)); EXPECT_TRUE(listener.WaitUntilSatisfied()); } diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc index 0f58e84..09a2680 100644 --- a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc +++ b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc @@ -213,7 +213,8 @@ class DelayLoadStartAndExecuteJavascript rvh_->GetMainFrame()->ExecuteJavaScriptWithUserGestureForTests( base::UTF8ToUTF16(script_)); } else { - rvh_->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16(script_)); + rvh_->GetMainFrame()->ExecuteJavaScriptForTests( + base::UTF8ToUTF16(script_)); } script_was_executed_ = true; } @@ -674,7 +675,8 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, CrossProcessAbort) { // Ensure the cross-site navigation has started, then execute JavaScript // to cause the renderer-initiated, non-user navigation. cross_site_load.Wait(); - tab->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16("navigate2()")); + tab->GetMainFrame()->ExecuteJavaScriptForTests( + base::UTF8ToUTF16("navigate2()")); // Wait for the same-site navigation to start and resume the cross-site // one, allowing it to commit. diff --git a/chrome/browser/geolocation/geolocation_browsertest.cc b/chrome/browser/geolocation/geolocation_browsertest.cc index 4d7812e..28f5e7d 100644 --- a/chrome/browser/geolocation/geolocation_browsertest.cc +++ b/chrome/browser/geolocation/geolocation_browsertest.cc @@ -90,7 +90,8 @@ IFrameLoader::IFrameLoader(Browser* browser, int iframe_id, const GURL& url) "window.domAutomationController.setAutomationId(0);" "window.domAutomationController.send(addIFrame(%d, \"%s\"));", iframe_id, url.spec().c_str())); - web_contents->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16(script)); + web_contents->GetMainFrame()->ExecuteJavaScriptForTests( + base::UTF8ToUTF16(script)); content::RunMessageLoop(); EXPECT_EQ(base::StringPrintf("\"%d\"", iframe_id), javascript_response_); diff --git a/chrome/browser/mouseleave_browsertest.cc b/chrome/browser/mouseleave_browsertest.cc index c4bcbcf..6719b93 100644 --- a/chrome/browser/mouseleave_browsertest.cc +++ b/chrome/browser/mouseleave_browsertest.cc @@ -130,7 +130,7 @@ IN_PROC_BROWSER_TEST_F(MouseLeaveTest, MAYBE_ContextMenu) { // Wait until the context menu is opened and closed. menu_observer.WaitForMenuOpenAndClose(); - tab->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16("done()")); + tab->GetMainFrame()->ExecuteJavaScriptForTests(base::ASCIIToUTF16("done()")); const base::string16 success_title = base::ASCIIToUTF16("without mouseleave"); const base::string16 failure_title = base::ASCIIToUTF16("with mouseleave"); content::TitleWatcher done_title_watcher(tab, success_title); @@ -156,12 +156,12 @@ IN_PROC_BROWSER_TEST_F(MouseLeaveTest, MAYBE_ModalDialog) { EXPECT_NO_FATAL_FAILURE(LoadTestPageAndWaitForMouseOver(tab)); - tab->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16("alert()")); + tab->GetMainFrame()->ExecuteJavaScriptForTests(base::UTF8ToUTF16("alert()")); app_modal::AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); // Cancel the dialog. alert->CloseModalDialog(); - tab->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16("done()")); + tab->GetMainFrame()->ExecuteJavaScriptForTests(base::ASCIIToUTF16("done()")); const base::string16 success_title = base::ASCIIToUTF16("without mouseleave"); const base::string16 failure_title = base::ASCIIToUTF16("with mouseleave"); content::TitleWatcher done_title_watcher(tab, success_title); diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index c24cfee..906357c 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc @@ -1263,14 +1263,15 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { } void RemoveLinkElement(int i) const { - GetActiveWebContents()->GetMainFrame()->ExecuteJavaScript( + GetActiveWebContents()->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16(base::StringPrintf("RemoveLinkElement(%d)", i))); } void ClickToNextPageAfterPrerender() { TestNavigationObserver nav_observer(GetActiveWebContents()); RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); - render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16("ClickOpenLink()")); + render_frame_host->ExecuteJavaScriptForTests( + base::ASCIIToUTF16("ClickOpenLink()")); nav_observer.Wait(); } @@ -1528,7 +1529,8 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { std::string javascript = base::StringPrintf( "AddPrerender('%s', %d)", url.spec().c_str(), index); RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); - render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); + render_frame_host->ExecuteJavaScriptForTests( + base::ASCIIToUTF16(javascript)); } // Returns a string for pattern-matching TaskManager tab entries. @@ -1678,7 +1680,8 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { } else { NavigationOrSwapObserver observer(current_browser()->tab_strip_model(), web_contents); - render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); + render_frame_host->ExecuteJavaScriptForTests( + base::ASCIIToUTF16(javascript)); observer.Wait(); } } diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc index 59c36a8..19b1715 100644 --- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc +++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc @@ -568,7 +568,7 @@ class SafeBrowsingBlockingPageBrowserTest // We don't use ExecuteScriptAndGetValue for this one, since clicking // the button/link may navigate away before the injected javascript can // reply, hanging the test. - rvh->GetMainFrame()->ExecuteJavaScript( + rvh->GetMainFrame()->ExecuteJavaScriptForTests( base::ASCIIToUTF16( "document.getElementById('" + node_id + "').click();\n")); return true; diff --git a/chrome/browser/task_manager/task_manager_browsertest.cc b/chrome/browser/task_manager/task_manager_browsertest.cc index 5d13c53..3c27c47 100644 --- a/chrome/browser/task_manager/task_manager_browsertest.cc +++ b/chrome/browser/task_manager/task_manager_browsertest.cc @@ -257,7 +257,8 @@ IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, tab1->GetMainFrame()->ExecuteJavaScriptWithUserGestureForTests( base::ASCIIToUTF16("window.open('title3.html', '_blank');")); // ... then immediately hang the renderer so that title3.html can't load. - tab1->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16("while(1);")); + tab1->GetMainFrame()->ExecuteJavaScriptForTests( + base::ASCIIToUTF16("while(1);")); // Blocks until a new WebContents appears. WebContents* tab2 = web_contents_added_observer.GetWebContents(); diff --git a/chrome/browser/ui/blocked_content/popup_blocker_browsertest.cc b/chrome/browser/ui/blocked_content/popup_blocker_browsertest.cc index f88dc9d..f6b7653 100644 --- a/chrome/browser/ui/blocked_content/popup_blocker_browsertest.cc +++ b/chrome/browser/ui/blocked_content/popup_blocker_browsertest.cc @@ -491,13 +491,13 @@ IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, ClosableAfterNavigation) { // Navigate it elsewhere. content::TestNavigationObserver nav_observer(popup); - popup->GetMainFrame()->ExecuteJavaScript( + popup->GetMainFrame()->ExecuteJavaScriptForTests( base::UTF8ToUTF16("location.href = '/empty.html'")); nav_observer.Wait(); // Have it close itself. CloseObserver close_observer(popup); - popup->GetMainFrame()->ExecuteJavaScript( + popup->GetMainFrame()->ExecuteJavaScriptForTests( base::UTF8ToUTF16("window.close()")); close_observer.Wait(); } @@ -574,7 +574,7 @@ IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, ModalPopUnder) { ASSERT_NE(popup_browser, browser()); // Showing an alert will raise the tab over the popup. - tab->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16("alert()")); + tab->GetMainFrame()->ExecuteJavaScriptForTests(base::UTF8ToUTF16("alert()")); app_modal::AppModalDialog* dialog = ui_test_utils::WaitForAppModalDialog(); // Verify that after the dialog was closed, the popup is in front again. diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc index e1390ac..43ca353 100644 --- a/chrome/browser/ui/browser_browsertest.cc +++ b/chrome/browser/ui/browser_browsertest.cc @@ -544,7 +544,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, JavascriptAlertActivatesTab) { EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); WebContents* second_tab = browser()->tab_strip_model()->GetWebContentsAt(1); ASSERT_TRUE(second_tab); - second_tab->GetMainFrame()->ExecuteJavaScript( + second_tab->GetMainFrame()->ExecuteJavaScriptForTests( ASCIIToUTF16("alert('Activate!');")); AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); alert->CloseModalDialog(); @@ -651,7 +651,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, DISABLED_CrossProcessNavCancelsDialogs) { // even if the renderer tries to synchronously create more. // See http://crbug.com/312490. WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); - contents->GetMainFrame()->ExecuteJavaScript( + contents->GetMainFrame()->ExecuteJavaScriptForTests( ASCIIToUTF16("alert('one'); alert('two');")); AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); EXPECT_TRUE(alert->IsValid()); @@ -677,7 +677,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, SadTabCancelsDialogs) { // Start a navigation to trigger the beforeunload dialog. WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); - contents->GetMainFrame()->ExecuteJavaScript( + contents->GetMainFrame()->ExecuteJavaScriptForTests( ASCIIToUTF16("window.location.href = 'data:text/html,foo'")); AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); EXPECT_TRUE(alert->IsValid()); @@ -703,7 +703,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, SadTabCancelsDialogs) { IN_PROC_BROWSER_TEST_F(BrowserTest, SadTabCancelsSubframeDialogs) { // Navigate to an iframe that opens an alert dialog. WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); - contents->GetMainFrame()->ExecuteJavaScript( + contents->GetMainFrame()->ExecuteJavaScriptForTests( ASCIIToUTF16("window.location.href = 'data:text/html," "<iframe srcdoc=\"<script>alert(1)</script>\">'")); AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); @@ -767,7 +767,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, ReloadThenCancelBeforeUnload) { // Clear the beforeunload handler so the test can easily exit. browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame()-> - ExecuteJavaScript(ASCIIToUTF16("onbeforeunload=null;")); + ExecuteJavaScriptForTests(ASCIIToUTF16("onbeforeunload=null;")); } class RedirectObserver : public content::WebContentsObserver { @@ -928,7 +928,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, CancelBeforeUnloadResetsURL) { // Clear the beforeunload handler so the test can easily exit. browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame()-> - ExecuteJavaScript(ASCIIToUTF16("onbeforeunload=null;")); + ExecuteJavaScriptForTests(ASCIIToUTF16("onbeforeunload=null;")); } // Test for crbug.com/11647. A page closed with window.close() should not have @@ -2068,7 +2068,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, InterstitialClosesDialogs) { ui_test_utils::NavigateToURL(browser(), url); WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); - contents->GetMainFrame()->ExecuteJavaScript( + contents->GetMainFrame()->ExecuteJavaScriptForTests( ASCIIToUTF16("alert('Dialog showing!');")); AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); EXPECT_TRUE(alert->IsValid()); diff --git a/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc b/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc index bb7ddef..28a03e5 100644 --- a/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc +++ b/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc @@ -212,7 +212,7 @@ class SelectFileDialogExtensionBrowserTest : public ExtensionBrowserTest { "document.querySelector(\'" + button_class + "\').click();"); // The file selection handler closes the dialog and does not return control // to JavaScript, so do not wait for return values. - host->GetMainFrame()->ExecuteJavaScript(script); + host->GetMainFrame()->ExecuteJavaScriptForTests(script); LOG(INFO) << "Waiting for window close notification."; listener_->WaitForCalled(); diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc index 8dd1835..42dbcfa 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc @@ -765,20 +765,20 @@ void GaiaScreenHandler::SubmitLoginFormForTest() { code += "document.getElementById('Passwd').value = '" + test_pass_ + "';"; code += "document.getElementById('signIn').click();"; - frame->ExecuteJavaScript(base::ASCIIToUTF16(code)); + frame->ExecuteJavaScriptForTests(base::ASCIIToUTF16(code)); } else { std::string code; code = "document.getElementById('identifier').value = '" + test_user_ + "';"; code += "document.getElementById('nextButton').click();"; - frame->ExecuteJavaScript(base::ASCIIToUTF16(code)); + frame->ExecuteJavaScriptForTests(base::ASCIIToUTF16(code)); if (!test_pass_.empty()) { code = "document.getElementById('password').value = '" + test_pass_ + "';"; code += "document.getElementById('nextButton').click();"; - frame->ExecuteJavaScript(base::ASCIIToUTF16(code)); + frame->ExecuteJavaScriptForTests(base::ASCIIToUTF16(code)); } } diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc index af317e0..dda57e2 100644 --- a/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc +++ b/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc @@ -248,7 +248,7 @@ void NetInternalsTest::MessageHandler::NavigateToPrerender( ASSERT_TRUE(list_value->GetString(0, &url)); content::RenderFrameHost* frame = browser()->tab_strip_model()->GetWebContentsAt(1)->GetMainFrame(); - frame->ExecuteJavaScript( + frame->ExecuteJavaScriptForTests( base::ASCIIToUTF16(base::StringPrintf("Click('%s')", url.c_str()))); } diff --git a/chrome/browser/ui/webui/web_ui_test_handler.cc b/chrome/browser/ui/webui/web_ui_test_handler.cc index 8cf270e..d4e03aa 100644 --- a/chrome/browser/ui/webui/web_ui_test_handler.cc +++ b/chrome/browser/ui/webui/web_ui_test_handler.cc @@ -37,7 +37,8 @@ void WebUITestHandler::PreloadJavaScript(const base::string16& js_text, } void WebUITestHandler::RunJavaScript(const base::string16& js_text) { - web_ui()->GetWebContents()->GetMainFrame()->ExecuteJavaScript(js_text); + web_ui()->GetWebContents()->GetMainFrame()->ExecuteJavaScriptForTests( + js_text); } bool WebUITestHandler::RunJavaScriptTestWithResult( @@ -45,9 +46,9 @@ bool WebUITestHandler::RunJavaScriptTestWithResult( test_succeeded_ = false; run_test_succeeded_ = false; content::RenderFrameHost* frame = web_ui()->GetWebContents()->GetMainFrame(); - frame->ExecuteJavaScript(js_text, - base::Bind(&WebUITestHandler::JavaScriptComplete, - base::Unretained(this))); + frame->ExecuteJavaScriptForTests( + js_text, base::Bind(&WebUITestHandler::JavaScriptComplete, + base::Unretained(this))); return WaitForResult(); } diff --git a/chrome/renderer/autofill/autofill_renderer_browsertest.cc b/chrome/renderer/autofill/autofill_renderer_browsertest.cc index f8f6bf9..f8bde26 100644 --- a/chrome/renderer/autofill/autofill_renderer_browsertest.cc +++ b/chrome/renderer/autofill/autofill_renderer_browsertest.cc @@ -122,7 +122,7 @@ TEST_F(AutofillRendererTest, SendForms) { // Dynamically create a new form. A new message should be sent for it, but // not for the previous form. - ExecuteJavaScript( + ExecuteJavaScriptForTests( "var newForm=document.createElement('form');" "newForm.id='new_testform';" "newForm.action='http://google.com';" @@ -220,7 +220,7 @@ TEST_F(AutofillRendererTest, DynamicallyAddedUnownedFormElements) { render_thread_->sink().ClearMessages(); - ExecuteJavaScript("AddFields()"); + ExecuteJavaScriptForTests("AddFields()"); msg_loop_.RunUntilIdle(); message = render_thread_->sink().GetFirstMessageMatching( diff --git a/chrome/renderer/autofill/form_autocomplete_browsertest.cc b/chrome/renderer/autofill/form_autocomplete_browsertest.cc index 1a88f8d..52a3db5 100644 --- a/chrome/renderer/autofill/form_autocomplete_browsertest.cc +++ b/chrome/renderer/autofill/form_autocomplete_browsertest.cc @@ -74,7 +74,7 @@ TEST_F(FormAutocompleteTest, NormalFormSubmit) { "<input name='lname' value='Deckard'/></form></html>"); // Submit the form. - ExecuteJavaScript("document.getElementById('myForm').submit();"); + ExecuteJavaScriptForTests("document.getElementById('myForm').submit();"); ProcessPendingMessages(); VerifyReceivedRendererMessages(render_thread_.get(), @@ -91,7 +91,7 @@ TEST_F(FormAutocompleteTest, SubmitEventPrevented) { "</html>"); // Submit the form. - ExecuteJavaScript( + ExecuteJavaScriptForTests( "var form = document.forms[0];" "form.onsubmit = function(event) { event.preventDefault(); };" "document.querySelector('input[type=submit]').click();"); @@ -111,7 +111,7 @@ TEST_F(FormAutocompleteTest, AutoCompleteOffFormSubmit) { "</form></html>"); // Submit the form. - ExecuteJavaScript("document.getElementById('myForm').submit();"); + ExecuteJavaScriptForTests("document.getElementById('myForm').submit();"); ProcessPendingMessages(); VerifyReceivedRendererMessages(render_thread_.get(), @@ -127,7 +127,7 @@ TEST_F(FormAutocompleteTest, AutoCompleteOffInputSubmit) { "</form></html>"); // Submit the form. - ExecuteJavaScript("document.getElementById('myForm').submit();"); + ExecuteJavaScriptForTests("document.getElementById('myForm').submit();"); ProcessPendingMessages(); VerifyReceivedRendererMessages(render_thread_.get(), @@ -148,13 +148,14 @@ TEST_F(FormAutocompleteTest, DynamicAutoCompleteOffFormSubmit) { EXPECT_TRUE(form.autoComplete()); // Dynamically mark the form as autocomplete off. - ExecuteJavaScript("document.getElementById('myForm')." - "setAttribute('autocomplete', 'off');"); + ExecuteJavaScriptForTests( + "document.getElementById('myForm')." + "setAttribute('autocomplete', 'off');"); ProcessPendingMessages(); EXPECT_FALSE(form.autoComplete()); // Submit the form. - ExecuteJavaScript("document.getElementById('myForm').submit();"); + ExecuteJavaScriptForTests("document.getElementById('myForm').submit();"); ProcessPendingMessages(); VerifyReceivedRendererMessages(render_thread_.get(), diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc index f3b46da..b662bd8 100644 --- a/chrome/renderer/autofill/form_autofill_browsertest.cc +++ b/chrome/renderer/autofill/form_autofill_browsertest.cc @@ -2132,7 +2132,7 @@ TEST_F(FormAutofillTest, OnlyExtractNewForms) { ASSERT_TRUE(forms.empty()); // Append to the current form will re-extract. - ExecuteJavaScript( + ExecuteJavaScriptForTests( "var newInput = document.createElement('input');" "newInput.setAttribute('type', 'text');" "newInput.setAttribute('id', 'telephone');" @@ -2169,7 +2169,7 @@ TEST_F(FormAutofillTest, OnlyExtractNewForms) { forms.clear(); // Completely new form will also be extracted. - ExecuteJavaScript( + ExecuteJavaScriptForTests( "var newForm=document.createElement('form');" "newForm.id='new_testform';" "newForm.action='http://google.com';" diff --git a/chrome/renderer/autofill/page_click_tracker_browsertest.cc b/chrome/renderer/autofill/page_click_tracker_browsertest.cc index a6a5a2b..9a498c9 100644 --- a/chrome/renderer/autofill/page_click_tracker_browsertest.cc +++ b/chrome/renderer/autofill/page_click_tracker_browsertest.cc @@ -126,7 +126,7 @@ TEST_F(PageClickTrackerTest, PageClickTrackerInputRightClicked) { TEST_F(PageClickTrackerTest, PageClickTrackerInputFocusedAndClicked) { // Focus the text field without a click. - ExecuteJavaScript("document.getElementById('text_1').focus();"); + ExecuteJavaScriptForTests("document.getElementById('text_1').focus();"); EXPECT_FALSE(test_listener_.form_control_element_clicked_called_); test_listener_.ClearResults(); @@ -161,7 +161,7 @@ TEST_F(PageClickTrackerTest, PageClickTrackerTextAreaClicked) { TEST_F(PageClickTrackerTest, PageClickTrackerTextAreaFocusedAndClicked) { // Focus the textarea without a click. - ExecuteJavaScript("document.getElementById('textarea_1').focus();"); + ExecuteJavaScriptForTests("document.getElementById('textarea_1').focus();"); EXPECT_FALSE(test_listener_.form_control_element_clicked_called_); test_listener_.ClearResults(); diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc index cfa15cd..6a0cc2e 100644 --- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc +++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc @@ -805,7 +805,7 @@ TEST_F(PasswordAutofillAgentTest, NoDOMActivationTest) { // Trigger the initial autocomplete. SimulateOnFillPasswordForm(fill_data_); - ExecuteJavaScript(kJavaScriptClick); + ExecuteJavaScriptForTests(kJavaScriptClick); CheckTextFieldsDOMState(kAliceUsername, true, "", true); } @@ -1680,7 +1680,7 @@ TEST_F(PasswordAutofillAgentTest, FindingFieldsWithAutofillPredictions) { "new_input.setAttribute('type', 'text');" "new_input.setAttribute('id', 'other_field');" "form.appendChild(new_input);"; - ExecuteJavaScript(add_field_to_form.c_str()); + ExecuteJavaScriptForTests(add_field_to_form.c_str()); static_cast<content::RenderFrameObserver*>(password_autofill_agent_) ->WillSendSubmitEvent(username_element_.form()); diff --git a/chrome/renderer/autofill/password_generation_agent_browsertest.cc b/chrome/renderer/autofill/password_generation_agent_browsertest.cc index 731d7c0..3fc06a1 100644 --- a/chrome/renderer/autofill/password_generation_agent_browsertest.cc +++ b/chrome/renderer/autofill/password_generation_agent_browsertest.cc @@ -51,7 +51,7 @@ class PasswordGenerationAgentTest : public ChromeRenderViewTest { blink::WebElement element = document.getElementById(blink::WebString::fromUTF8(element_id)); ASSERT_FALSE(element.isNull()); - ExecuteJavaScript( + ExecuteJavaScriptForTests( base::StringPrintf("document.getElementById('%s').focus();", element_id).c_str()); } @@ -418,12 +418,13 @@ TEST_F(PasswordGenerationAgentTest, MaximumOfferSize) { // Change focus. Bubble should be hidden, but that is handled by AutofilAgent, // so no messages are sent. - ExecuteJavaScript("document.getElementById('username').focus();"); + ExecuteJavaScriptForTests("document.getElementById('username').focus();"); EXPECT_EQ(0u, password_generation_->messages().size()); password_generation_->clear_messages(); // Focusing the password field will bring up the generation UI again. - ExecuteJavaScript("document.getElementById('first_password').focus();"); + ExecuteJavaScriptForTests( + "document.getElementById('first_password').focus();"); ASSERT_EQ(1u, password_generation_->messages().size()); EXPECT_EQ(AutofillHostMsg_ShowPasswordGenerationPopup::ID, password_generation_->messages()[0]->type()); @@ -443,7 +444,7 @@ TEST_F(PasswordGenerationAgentTest, DynamicFormTest) { LoadHTMLWithUserGesture(kSigninFormHTML); SetNotBlacklistedMessage(password_generation_, kSigninFormHTML); - ExecuteJavaScript( + ExecuteJavaScriptForTests( "var form = document.createElement('form');" "var username = document.createElement('input');" "username.type = 'text';" diff --git a/components/dom_distiller/content/browser/distiller_page_web_contents_browsertest.cc b/components/dom_distiller/content/browser/distiller_page_web_contents_browsertest.cc index 99f40f0..ac503d9 100644 --- a/components/dom_distiller/content/browser/distiller_page_web_contents_browsertest.cc +++ b/components/dom_distiller/content/browser/distiller_page_web_contents_browsertest.cc @@ -504,7 +504,7 @@ IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, // Execute the JS to run the tests, and wait until it has finished. base::RunLoop run_loop; - web_contents->GetMainFrame()->ExecuteJavaScript( + web_contents->GetMainFrame()->ExecuteJavaScriptForTests( base::UTF8ToUTF16("(function() {return pinchtest.run();})();"), base::Bind(&DistillerPageWebContentsTest::OnJsExecutionDone, base::Unretained(this), run_loop.QuitClosure())); diff --git a/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc b/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc index 97c48d6..44572d2 100644 --- a/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc +++ b/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc @@ -121,7 +121,7 @@ IN_PROC_BROWSER_TEST_F(DomDistillerJsTest, RunJsTests) { // QuitClosure multiple times. base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, run_loop.QuitClosure(), base::TimeDelta::FromSeconds(15)); - web_contents->GetMainFrame()->ExecuteJavaScript( + web_contents->GetMainFrame()->ExecuteJavaScriptForTests( base::UTF8ToUTF16(kRunJsTestsJs), base::Bind(&DomDistillerJsTest::OnJsTestExecutionDone, base::Unretained(this))); diff --git a/components/printing/test/print_web_view_helper_browsertest.cc b/components/printing/test/print_web_view_helper_browsertest.cc index 28d2523..c1eb584 100644 --- a/components/printing/test/print_web_view_helper_browsertest.cc +++ b/components/printing/test/print_web_view_helper_browsertest.cc @@ -153,7 +153,7 @@ class PrintWebViewHelperTestBase : public content::RenderViewTest { } void PrintWithJavaScript() { - ExecuteJavaScript("window.print();"); + ExecuteJavaScriptForTests("window.print();"); ProcessPendingMessages(); } // The renderer should be done calculating the number of rendered pages 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)); } diff --git a/extensions/browser/api/system_storage/system_storage_eject_apitest.cc b/extensions/browser/api/system_storage/system_storage_eject_apitest.cc index da9a59d..bebd665 100644 --- a/extensions/browser/api/system_storage/system_storage_eject_apitest.cc +++ b/extensions/browser/api/system_storage/system_storage_eject_apitest.cc @@ -58,7 +58,8 @@ class SystemStorageEjectApiTest : public extensions::ShellApiTest { const std::string& js_command, const std::string& ok_message) { ExtensionTestMessageListener listener(ok_message, false); - host->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16(js_command)); + host->GetMainFrame()->ExecuteJavaScriptForTests( + base::ASCIIToUTF16(js_command)); EXPECT_TRUE(listener.WaitUntilSatisfied()); } |