Index: ios/web/web_state/ui/crw_web_controller_unittest.mm |
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm |
index e0b987a064fb423f0db352d32e7c6c2ecc757cc9..ff3099e6205d0b02fbad49d50a489886f27a80ef 100644 |
--- a/ios/web/web_state/ui/crw_web_controller_unittest.mm |
+++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm |
@@ -33,6 +33,7 @@ |
#import "ios/web/test/web_test_with_web_controller.h" |
#import "ios/web/test/wk_web_view_crash_utils.h" |
#import "ios/web/web_state/ui/crw_web_controller_container_view.h" |
+#import "ios/web/web_state/ui/web_view_js_utils.h" |
#import "ios/web/web_state/web_state_impl.h" |
#import "ios/web/web_state/wk_web_view_security_util.h" |
#import "net/base/mac/url_conversions.h" |
@@ -874,6 +875,68 @@ TEST_F(CRWWebControllerTitleTest, TitleChange) { |
EXPECT_GE(observer.title_change_count(), 2); |
}; |
+// Test fixture for JavaScript execution. |
+class ScriptExecutionTest : public web::WebTestWithWebController { |
+ protected: |
+ // Calls |executeUserJavaScript:completionHandler:|, waits for script |
+ // execution completion, and synchronously returns the result. |
+ id ExecuteUserJavaScript(NSString* java_script, NSError** error) { |
+ __block id script_result = nil; |
+ __block NSError* script_error = nil; |
+ __block bool script_executed = false; |
+ [web_controller() |
+ executeUserJavaScript:java_script |
+ completionHandler:^(id local_result, NSError* local_error) { |
+ script_result = [local_result retain]; |
+ script_error = [local_error retain]; |
+ script_executed = true; |
+ }]; |
+ |
+ WaitForCondition(^{ |
+ return script_executed; |
+ }); |
+ |
+ if (error) { |
+ *error = script_error; |
+ } |
+ [script_error autorelease]; |
+ return [script_result autorelease]; |
+ } |
+}; |
+ |
+// Tests evaluating user script on an http page. |
+TEST_F(ScriptExecutionTest, UserScriptOnHttpPage) { |
+ LoadHtml(@"<html></html>", GURL(kTestURLString)); |
+ NSError* error = nil; |
+ EXPECT_NSEQ(@0, ExecuteUserJavaScript(@"window.w = 0;", &error)); |
+ EXPECT_FALSE(error); |
+ |
+ EXPECT_NSEQ(@0, ExecuteJavaScript(@"window.w")); |
+}; |
+ |
+// Tests evaluating user script on app-specific page. Pages with app-specific |
+// URLs have elevated privileges and JavaScript execution should not be allowed |
+// for them. |
+TEST_F(ScriptExecutionTest, UserScriptOnAppSpecificPage) { |
+ LoadHtml(@"<html></html>", GURL(kTestURLString)); |
+ |
+ // Change last committed URL to app-specific URL. |
+ web::NavigationManagerImpl& nav_manager = |
+ [web_controller() webStateImpl]->GetNavigationManagerImpl(); |
+ nav_manager.AddPendingItem(GURL(kTestAppSpecificURL), web::Referrer(), |
+ ui::PAGE_TRANSITION_TYPED, |
+ web::NavigationInitiationType::USER_INITIATED); |
+ [nav_manager.GetSessionController() commitPendingItem]; |
+ |
+ NSError* error = nil; |
+ EXPECT_FALSE(ExecuteUserJavaScript(@"window.w = 0;", &error)); |
+ ASSERT_TRUE(error); |
+ EXPECT_NSEQ(web::kJSEvaluationErrorDomain, error.domain); |
+ EXPECT_EQ(web::JS_EVALUATION_ERROR_CODE_NO_WEB_VIEW, error.code); |
+ |
+ EXPECT_FALSE(ExecuteJavaScript(@"window.w")); |
+}; |
+ |
// Fixture class to test WKWebView crashes. |
class CRWWebControllerWebProcessTest : public web::WebTestWithWebController { |
protected: |