| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ios/web/web_state/ui/crw_web_controller.h" | 5 #import "ios/web/web_state/ui/crw_web_controller.h" |
| 6 | 6 |
| 7 #import <WebKit/WebKit.h> | 7 #import <WebKit/WebKit.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 GetWebClient()->last_cert_error_ssl_info().cert_status); | 277 GetWebClient()->last_cert_error_ssl_info().cert_status); |
| 278 EXPECT_EQ(url, GetWebClient()->last_cert_error_request_url()); | 278 EXPECT_EQ(url, GetWebClient()->last_cert_error_request_url()); |
| 279 EXPECT_FALSE(GetWebClient()->last_cert_error_overridable()); | 279 EXPECT_FALSE(GetWebClient()->last_cert_error_overridable()); |
| 280 | 280 |
| 281 // Verify that |DidChangeVisibleSecurityState| was called. | 281 // Verify that |DidChangeVisibleSecurityState| was called. |
| 282 ASSERT_TRUE(observer.did_change_visible_security_state_info()); | 282 ASSERT_TRUE(observer.did_change_visible_security_state_info()); |
| 283 EXPECT_EQ(web_state(), | 283 EXPECT_EQ(web_state(), |
| 284 observer.did_change_visible_security_state_info()->web_state); | 284 observer.did_change_visible_security_state_info()->web_state); |
| 285 } | 285 } |
| 286 | 286 |
| 287 // Test fixture to test |setPageDialogOpenPolicy:|. | 287 // Test fixture to test |WebState::SetShouldSuppressDialogs|. |
| 288 class CRWWebControllerPageDialogOpenPolicyTest | 288 class DialogsSuppressionTest : public web::WebTestWithWebState { |
| 289 : public web::WebTestWithWebController { | |
| 290 protected: | 289 protected: |
| 291 CRWWebControllerPageDialogOpenPolicyTest() | 290 DialogsSuppressionTest() : page_url_("https://chromium.test/") {} |
| 292 : page_url_("https://chromium.test/") {} | |
| 293 void SetUp() override { | 291 void SetUp() override { |
| 294 web::WebTestWithWebController::SetUp(); | 292 web::WebTestWithWebState::SetUp(); |
| 295 LoadHtml(@"<html><body></body></html>", page_url_); | 293 LoadHtml(@"<html><body></body></html>", page_url_); |
| 296 web_delegate_mock_.reset( | |
| 297 [[OCMockObject mockForProtocol:@protocol(CRWWebDelegate)] retain]); | |
| 298 [web_controller() setDelegate:web_delegate_mock_]; | |
| 299 web_state()->SetDelegate(&test_web_delegate_); | 294 web_state()->SetDelegate(&test_web_delegate_); |
| 300 } | 295 } |
| 301 void TearDown() override { | 296 void TearDown() override { |
| 302 WaitForBackgroundTasks(); | |
| 303 EXPECT_OCMOCK_VERIFY(web_delegate_mock_); | |
| 304 [web_controller() setDelegate:nil]; | |
| 305 web_state()->SetDelegate(nullptr); | 297 web_state()->SetDelegate(nullptr); |
| 306 | 298 web::WebTestWithWebState::TearDown(); |
| 307 web::WebTestWithWebController::TearDown(); | |
| 308 } | 299 } |
| 309 id web_delegate_mock() { return web_delegate_mock_; }; | |
| 310 web::TestJavaScriptDialogPresenter* js_dialog_presenter() { | 300 web::TestJavaScriptDialogPresenter* js_dialog_presenter() { |
| 311 return test_web_delegate_.GetTestJavaScriptDialogPresenter(); | 301 return test_web_delegate_.GetTestJavaScriptDialogPresenter(); |
| 312 } | 302 } |
| 313 const std::vector<web::TestJavaScriptDialog>& requested_dialogs() { | 303 const std::vector<web::TestJavaScriptDialog>& requested_dialogs() { |
| 314 return js_dialog_presenter()->requested_dialogs(); | 304 return js_dialog_presenter()->requested_dialogs(); |
| 315 } | 305 } |
| 316 const GURL& page_url() { return page_url_; } | 306 const GURL& page_url() { return page_url_; } |
| 317 | 307 |
| 318 private: | 308 private: |
| 319 web::TestWebStateDelegate test_web_delegate_; | 309 web::TestWebStateDelegate test_web_delegate_; |
| 320 base::scoped_nsprotocol<id> web_delegate_mock_; | |
| 321 GURL page_url_; | 310 GURL page_url_; |
| 322 }; | 311 }; |
| 323 | 312 |
| 324 // Tests that window.alert dialog is suppressed for DIALOG_POLICY_SUPPRESS. | 313 // Tests that window.alert dialog is suppressed. |
| 325 TEST_F(CRWWebControllerPageDialogOpenPolicyTest, SuppressAlert) { | 314 TEST_F(DialogsSuppressionTest, SuppressAlert) { |
| 326 [[web_delegate_mock() expect] | 315 web::TestWebStateObserver observer(web_state()); |
| 327 webControllerDidSuppressDialog:web_controller()]; | 316 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 328 [web_controller() setShouldSuppressDialogs:YES]; | 317 web_state()->SetShouldSuppressDialogs(true); |
| 329 ExecuteJavaScript(@"alert('test')"); | 318 ExecuteJavaScript(@"alert('test')"); |
| 319 ASSERT_TRUE(observer.did_suppress_dialog_info()); |
| 320 EXPECT_EQ(web_state(), observer.did_suppress_dialog_info()->web_state); |
| 330 }; | 321 }; |
| 331 | 322 |
| 332 // Tests that window.alert dialog is shown for DIALOG_POLICY_ALLOW. | 323 // Tests that window.alert dialog is shown. |
| 333 TEST_F(CRWWebControllerPageDialogOpenPolicyTest, AllowAlert) { | 324 TEST_F(DialogsSuppressionTest, AllowAlert) { |
| 325 web::TestWebStateObserver observer(web_state()); |
| 326 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 334 ASSERT_TRUE(requested_dialogs().empty()); | 327 ASSERT_TRUE(requested_dialogs().empty()); |
| 335 | 328 |
| 336 [web_controller() setShouldSuppressDialogs:NO]; | 329 web_state()->SetShouldSuppressDialogs(false); |
| 337 ExecuteJavaScript(@"alert('test')"); | 330 ExecuteJavaScript(@"alert('test')"); |
| 338 | 331 |
| 339 ASSERT_EQ(1U, requested_dialogs().size()); | 332 ASSERT_EQ(1U, requested_dialogs().size()); |
| 340 web::TestJavaScriptDialog dialog = requested_dialogs()[0]; | 333 web::TestJavaScriptDialog dialog = requested_dialogs()[0]; |
| 341 EXPECT_EQ(web_state(), dialog.web_state); | 334 EXPECT_EQ(web_state(), dialog.web_state); |
| 342 EXPECT_EQ(page_url(), dialog.origin_url); | 335 EXPECT_EQ(page_url(), dialog.origin_url); |
| 343 EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_ALERT, dialog.java_script_dialog_type); | 336 EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_ALERT, dialog.java_script_dialog_type); |
| 344 EXPECT_NSEQ(@"test", dialog.message_text); | 337 EXPECT_NSEQ(@"test", dialog.message_text); |
| 345 EXPECT_FALSE(dialog.default_prompt_text); | 338 EXPECT_FALSE(dialog.default_prompt_text); |
| 339 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 346 }; | 340 }; |
| 347 | 341 |
| 348 // Tests that window.confirm dialog is suppressed for DIALOG_POLICY_SUPPRESS. | 342 // Tests that window.confirm dialog is suppressed. |
| 349 TEST_F(CRWWebControllerPageDialogOpenPolicyTest, SuppressConfirm) { | 343 TEST_F(DialogsSuppressionTest, SuppressConfirm) { |
| 344 web::TestWebStateObserver observer(web_state()); |
| 345 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 350 ASSERT_TRUE(requested_dialogs().empty()); | 346 ASSERT_TRUE(requested_dialogs().empty()); |
| 351 | 347 |
| 352 [[web_delegate_mock() expect] | 348 web_state()->SetShouldSuppressDialogs(true); |
| 353 webControllerDidSuppressDialog:web_controller()]; | |
| 354 [web_controller() setShouldSuppressDialogs:YES]; | |
| 355 EXPECT_NSEQ(@NO, ExecuteJavaScript(@"confirm('test')")); | 349 EXPECT_NSEQ(@NO, ExecuteJavaScript(@"confirm('test')")); |
| 356 | 350 |
| 357 ASSERT_TRUE(requested_dialogs().empty()); | 351 ASSERT_TRUE(requested_dialogs().empty()); |
| 352 ASSERT_TRUE(observer.did_suppress_dialog_info()); |
| 353 EXPECT_EQ(web_state(), observer.did_suppress_dialog_info()->web_state); |
| 358 }; | 354 }; |
| 359 | 355 |
| 360 // Tests that window.confirm dialog is shown for DIALOG_POLICY_ALLOW and | 356 // Tests that window.confirm dialog is shown and its result is true. |
| 361 // it's result is true. | 357 TEST_F(DialogsSuppressionTest, AllowConfirmWithTrue) { |
| 362 TEST_F(CRWWebControllerPageDialogOpenPolicyTest, AllowConfirmWithTrue) { | 358 web::TestWebStateObserver observer(web_state()); |
| 359 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 363 ASSERT_TRUE(requested_dialogs().empty()); | 360 ASSERT_TRUE(requested_dialogs().empty()); |
| 364 | 361 |
| 365 js_dialog_presenter()->set_callback_success_argument(true); | 362 js_dialog_presenter()->set_callback_success_argument(true); |
| 366 | 363 |
| 367 [web_controller() setShouldSuppressDialogs:NO]; | 364 web_state()->SetShouldSuppressDialogs(false); |
| 368 EXPECT_NSEQ(@YES, ExecuteJavaScript(@"confirm('test')")); | 365 EXPECT_NSEQ(@YES, ExecuteJavaScript(@"confirm('test')")); |
| 369 | 366 |
| 370 ASSERT_EQ(1U, requested_dialogs().size()); | 367 ASSERT_EQ(1U, requested_dialogs().size()); |
| 371 web::TestJavaScriptDialog dialog = requested_dialogs()[0]; | 368 web::TestJavaScriptDialog dialog = requested_dialogs()[0]; |
| 372 EXPECT_EQ(web_state(), dialog.web_state); | 369 EXPECT_EQ(web_state(), dialog.web_state); |
| 373 EXPECT_EQ(page_url(), dialog.origin_url); | 370 EXPECT_EQ(page_url(), dialog.origin_url); |
| 374 EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_CONFIRM, | 371 EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_CONFIRM, |
| 375 dialog.java_script_dialog_type); | 372 dialog.java_script_dialog_type); |
| 376 EXPECT_NSEQ(@"test", dialog.message_text); | 373 EXPECT_NSEQ(@"test", dialog.message_text); |
| 377 EXPECT_FALSE(dialog.default_prompt_text); | 374 EXPECT_FALSE(dialog.default_prompt_text); |
| 375 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 378 } | 376 } |
| 379 | 377 |
| 380 // Tests that window.confirm dialog is shown for DIALOG_POLICY_ALLOW and | 378 // Tests that window.confirm dialog is shown and its result is false. |
| 381 // it's result is false. | 379 TEST_F(DialogsSuppressionTest, AllowConfirmWithFalse) { |
| 382 TEST_F(CRWWebControllerPageDialogOpenPolicyTest, AllowConfirmWithFalse) { | 380 web::TestWebStateObserver observer(web_state()); |
| 381 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 383 ASSERT_TRUE(requested_dialogs().empty()); | 382 ASSERT_TRUE(requested_dialogs().empty()); |
| 384 | 383 |
| 385 [web_controller() setShouldSuppressDialogs:NO]; | 384 web_state()->SetShouldSuppressDialogs(false); |
| 386 EXPECT_NSEQ(@NO, ExecuteJavaScript(@"confirm('test')")); | 385 EXPECT_NSEQ(@NO, ExecuteJavaScript(@"confirm('test')")); |
| 387 | 386 |
| 388 ASSERT_EQ(1U, requested_dialogs().size()); | 387 ASSERT_EQ(1U, requested_dialogs().size()); |
| 389 web::TestJavaScriptDialog dialog = requested_dialogs()[0]; | 388 web::TestJavaScriptDialog dialog = requested_dialogs()[0]; |
| 390 EXPECT_EQ(web_state(), dialog.web_state); | 389 EXPECT_EQ(web_state(), dialog.web_state); |
| 391 EXPECT_EQ(page_url(), dialog.origin_url); | 390 EXPECT_EQ(page_url(), dialog.origin_url); |
| 392 EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_CONFIRM, | 391 EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_CONFIRM, |
| 393 dialog.java_script_dialog_type); | 392 dialog.java_script_dialog_type); |
| 394 EXPECT_NSEQ(@"test", dialog.message_text); | 393 EXPECT_NSEQ(@"test", dialog.message_text); |
| 395 EXPECT_FALSE(dialog.default_prompt_text); | 394 EXPECT_FALSE(dialog.default_prompt_text); |
| 395 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 396 } | 396 } |
| 397 | 397 |
| 398 // Tests that window.prompt dialog is suppressed for DIALOG_POLICY_SUPPRESS. | 398 // Tests that window.prompt dialog is suppressed. |
| 399 TEST_F(CRWWebControllerPageDialogOpenPolicyTest, SuppressPrompt) { | 399 TEST_F(DialogsSuppressionTest, SuppressPrompt) { |
| 400 web::TestWebStateObserver observer(web_state()); |
| 401 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 400 ASSERT_TRUE(requested_dialogs().empty()); | 402 ASSERT_TRUE(requested_dialogs().empty()); |
| 401 | 403 |
| 402 [[web_delegate_mock() expect] | 404 web_state()->SetShouldSuppressDialogs(true); |
| 403 webControllerDidSuppressDialog:web_controller()]; | |
| 404 [web_controller() setShouldSuppressDialogs:YES]; | |
| 405 EXPECT_EQ([NSNull null], ExecuteJavaScript(@"prompt('Yes?', 'No')")); | 405 EXPECT_EQ([NSNull null], ExecuteJavaScript(@"prompt('Yes?', 'No')")); |
| 406 | 406 |
| 407 ASSERT_TRUE(requested_dialogs().empty()); | 407 ASSERT_TRUE(requested_dialogs().empty()); |
| 408 ASSERT_TRUE(observer.did_suppress_dialog_info()); |
| 409 EXPECT_EQ(web_state(), observer.did_suppress_dialog_info()->web_state); |
| 408 } | 410 } |
| 409 | 411 |
| 410 // Tests that window.prompt dialog is shown for DIALOG_POLICY_ALLOW. | 412 // Tests that window.prompt dialog is shown. |
| 411 TEST_F(CRWWebControllerPageDialogOpenPolicyTest, AllowPrompt) { | 413 TEST_F(DialogsSuppressionTest, AllowPrompt) { |
| 414 web::TestWebStateObserver observer(web_state()); |
| 415 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 412 ASSERT_TRUE(requested_dialogs().empty()); | 416 ASSERT_TRUE(requested_dialogs().empty()); |
| 413 | 417 |
| 414 js_dialog_presenter()->set_callback_user_input_argument(@"Maybe"); | 418 js_dialog_presenter()->set_callback_user_input_argument(@"Maybe"); |
| 415 | 419 |
| 416 [web_controller() setShouldSuppressDialogs:NO]; | 420 web_state()->SetShouldSuppressDialogs(false); |
| 417 EXPECT_NSEQ(@"Maybe", ExecuteJavaScript(@"prompt('Yes?', 'No')")); | 421 EXPECT_NSEQ(@"Maybe", ExecuteJavaScript(@"prompt('Yes?', 'No')")); |
| 418 | 422 |
| 419 ASSERT_EQ(1U, requested_dialogs().size()); | 423 ASSERT_EQ(1U, requested_dialogs().size()); |
| 420 web::TestJavaScriptDialog dialog = requested_dialogs()[0]; | 424 web::TestJavaScriptDialog dialog = requested_dialogs()[0]; |
| 421 EXPECT_EQ(web_state(), dialog.web_state); | 425 EXPECT_EQ(web_state(), dialog.web_state); |
| 422 EXPECT_EQ(page_url(), dialog.origin_url); | 426 EXPECT_EQ(page_url(), dialog.origin_url); |
| 423 EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_PROMPT, dialog.java_script_dialog_type); | 427 EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_PROMPT, dialog.java_script_dialog_type); |
| 424 EXPECT_NSEQ(@"Yes?", dialog.message_text); | 428 EXPECT_NSEQ(@"Yes?", dialog.message_text); |
| 425 EXPECT_NSEQ(@"No", dialog.default_prompt_text); | 429 EXPECT_NSEQ(@"No", dialog.default_prompt_text); |
| 430 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 426 } | 431 } |
| 427 | 432 |
| 428 // Tests that geolocation dialog is suppressed for DIALOG_POLICY_SUPPRESS. | 433 // Tests that geolocation dialog is suppressed. |
| 429 TEST_F(CRWWebControllerPageDialogOpenPolicyTest, SuppressGeolocation) { | 434 TEST_F(DialogsSuppressionTest, SuppressGeolocation) { |
| 430 // The geolocation APIs require HTTPS on iOS 10, which can not be simulated | 435 // The geolocation APIs require HTTPS on iOS 10, which can not be simulated |
| 431 // even using |loadHTMLString:baseURL:| WKWebView API. | 436 // even using |loadHTMLString:baseURL:| WKWebView API. |
| 432 if (base::ios::IsRunningOnIOS10OrLater()) { | 437 if (base::ios::IsRunningOnIOS10OrLater()) { |
| 433 return; | 438 return; |
| 434 } | 439 } |
| 440 web::TestWebStateObserver observer(web_state()); |
| 441 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 442 ASSERT_TRUE(requested_dialogs().empty()); |
| 435 | 443 |
| 436 [[web_delegate_mock() expect] | 444 web_state()->SetShouldSuppressDialogs(true); |
| 437 webControllerDidSuppressDialog:web_controller()]; | |
| 438 [web_controller() setShouldSuppressDialogs:YES]; | |
| 439 ExecuteJavaScript(@"navigator.geolocation.getCurrentPosition()"); | 445 ExecuteJavaScript(@"navigator.geolocation.getCurrentPosition()"); |
| 446 ASSERT_TRUE(observer.did_suppress_dialog_info()); |
| 447 EXPECT_EQ(web_state(), observer.did_suppress_dialog_info()->web_state); |
| 440 } | 448 } |
| 441 | 449 |
| 442 // Tests that window.open is suppressed for DIALOG_POLICY_SUPPRESS. | 450 // Tests that window.open is suppressed. |
| 443 TEST_F(CRWWebControllerPageDialogOpenPolicyTest, SuppressWindowOpen) { | 451 TEST_F(DialogsSuppressionTest, SuppressWindowOpen) { |
| 444 [[web_delegate_mock() expect] | 452 web::TestWebStateObserver observer(web_state()); |
| 445 webControllerDidSuppressDialog:web_controller()]; | 453 ASSERT_FALSE(observer.did_suppress_dialog_info()); |
| 446 [web_controller() setShouldSuppressDialogs:YES]; | 454 ASSERT_TRUE(requested_dialogs().empty()); |
| 455 |
| 456 web_state()->SetShouldSuppressDialogs(true); |
| 447 ExecuteJavaScript(@"window.open('')"); | 457 ExecuteJavaScript(@"window.open('')"); |
| 458 |
| 459 ASSERT_TRUE(observer.did_suppress_dialog_info()); |
| 460 EXPECT_EQ(web_state(), observer.did_suppress_dialog_info()->web_state); |
| 448 } | 461 } |
| 449 | 462 |
| 450 // A separate test class, as none of the |CRWWebControllerTest| setup is | 463 // A separate test class, as none of the |CRWWebControllerTest| setup is |
| 451 // needed. | 464 // needed. |
| 452 class CRWWebControllerPageScrollStateTest | 465 class CRWWebControllerPageScrollStateTest |
| 453 : public web::WebTestWithWebController { | 466 : public web::WebTestWithWebController { |
| 454 protected: | 467 protected: |
| 455 // Returns a web::PageDisplayState that will scroll a WKWebView to | 468 // Returns a web::PageDisplayState that will scroll a WKWebView to |
| 456 // |scrollOffset| and zoom the content by |relativeZoomScale|. | 469 // |scrollOffset| and zoom the content by |relativeZoomScale|. |
| 457 inline web::PageDisplayState CreateTestPageDisplayState( | 470 inline web::PageDisplayState CreateTestPageDisplayState( |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 955 web::TestWebStateObserver* observer_ptr = &observer; | 968 web::TestWebStateObserver* observer_ptr = &observer; |
| 956 web::SimulateWKWebViewCrash(webView_); | 969 web::SimulateWKWebViewCrash(webView_); |
| 957 base::test::ios::WaitUntilCondition(^bool() { | 970 base::test::ios::WaitUntilCondition(^bool() { |
| 958 return observer_ptr->render_process_gone_info(); | 971 return observer_ptr->render_process_gone_info(); |
| 959 }); | 972 }); |
| 960 EXPECT_EQ(web_state(), observer.render_process_gone_info()->web_state); | 973 EXPECT_EQ(web_state(), observer.render_process_gone_info()->web_state); |
| 961 EXPECT_FALSE([web_controller() isViewAlive]); | 974 EXPECT_FALSE([web_controller() isViewAlive]); |
| 962 }; | 975 }; |
| 963 | 976 |
| 964 } // namespace | 977 } // namespace |
| OLD | NEW |