diff options
author | jochen <jochen@chromium.org> | 2015-07-23 23:40:38 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-07-24 06:41:23 +0000 |
commit | 904f14ebdc3bdb8e893df0a3211d09de42d5619c (patch) | |
tree | 80df6a22ae7a5762ada15063c4e4f71cfaf5afe3 /content/public | |
parent | a8604cd20009b661384308e4cb6a522eae22968f (diff) | |
download | chromium_src-904f14ebdc3bdb8e893df0a3211d09de42d5619c.zip chromium_src-904f14ebdc3bdb8e893df0a3211d09de42d5619c.tar.gz chromium_src-904f14ebdc3bdb8e893df0a3211d09de42d5619c.tar.bz2 |
Add ExecuteJavaScriptForTest and make all tests use it
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}
Diffstat (limited to 'content/public')
13 files changed, 57 insertions, 21 deletions
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(); |