| 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 836bd30191964e44752f565d9674adc385f11f02..18f936718ed885d8ffd6b4af4442cd0915130a2c 100644
|
| --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm
|
| +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
|
| @@ -20,7 +20,6 @@
|
| #import "ios/web/public/test/fakes/test_native_content.h"
|
| #import "ios/web/public/test/fakes/test_native_content_provider.h"
|
| #import "ios/web/public/test/fakes/test_web_client.h"
|
| -#import "ios/web/public/test/fakes/test_web_state_delegate.h"
|
| #import "ios/web/public/test/fakes/test_web_view_content_view.h"
|
| #import "ios/web/public/web_state/crw_web_controller_observer.h"
|
| #import "ios/web/public/web_state/ui/crw_content_view.h"
|
| @@ -76,6 +75,63 @@
|
| : OCMockComplexTypeHelper<CRWWebUserInterfaceDelegate>
|
| @end
|
|
|
| +@implementation CRWWebUserInterfaceDelegateStub
|
| +
|
| +- (void)webController:(CRWWebController*)webController
|
| + runJavaScriptAlertPanelWithMessage:(NSString*)message
|
| + requestURL:(const GURL&)requestURL
|
| + completionHandler:(void (^)(void))completionHandler {
|
| + void (^stubBlock)(CRWWebController*, NSString*, const GURL&, id) =
|
| + [self blockForSelector:_cmd];
|
| + stubBlock(webController, message, requestURL, completionHandler);
|
| +}
|
| +
|
| +- (void)webController:(CRWWebController*)webController
|
| + runJavaScriptConfirmPanelWithMessage:(NSString*)message
|
| + requestURL:(const GURL&)requestURL
|
| + completionHandler:(void (^)(BOOL))completionHandler {
|
| + void (^stubBlock)(CRWWebController*, NSString*, const GURL&, id) =
|
| + [self blockForSelector:_cmd];
|
| + stubBlock(webController, message, requestURL, completionHandler);
|
| +}
|
| +
|
| +- (void)webController:(CRWWebController*)webController
|
| + runJavaScriptTextInputPanelWithPrompt:(NSString*)message
|
| + defaultText:(NSString*)defaultText
|
| + requestURL:(const GURL&)requestURL
|
| + completionHandler:
|
| + (void (^)(NSString* input))completionHandler {
|
| + void (^stubBlock)(CRWWebController*, NSString*, NSString*, const GURL&, id) =
|
| + [self blockForSelector:_cmd];
|
| + stubBlock(webController, message, defaultText, requestURL, completionHandler);
|
| +}
|
| +
|
| +- (BOOL)respondsToSelector:(SEL)selector {
|
| + // OCMockComplexTypeHelper DCHECKs when respondsToSelector: is called for
|
| + // expected selector.
|
| + if (selector == @selector(webController:
|
| + runJavaScriptAlertPanelWithMessage:
|
| + requestURL:
|
| + completionHandler:)) {
|
| + return YES;
|
| + }
|
| + if (selector == @selector(webController:
|
| + runJavaScriptConfirmPanelWithMessage:
|
| + requestURL:
|
| + completionHandler:)) {
|
| + return YES;
|
| + }
|
| + if (selector == @selector(webController:
|
| + runJavaScriptTextInputPanelWithPrompt:
|
| + defaultText:
|
| + requestURL:
|
| + completionHandler:)) {
|
| + return YES;
|
| + }
|
| + return [super respondsToSelector:selector];
|
| +}
|
| +@end
|
| +
|
| @implementation MockInteractionLoader {
|
| // Backs up the property with the same name.
|
| std::unique_ptr<web::BlockedPopupInfo> _blockedPopupInfo;
|
| @@ -402,37 +458,39 @@
|
| class CRWWebControllerPageDialogOpenPolicyTest
|
| : public web::WebTestWithWebController {
|
| protected:
|
| - CRWWebControllerPageDialogOpenPolicyTest()
|
| - : page_url_("https://chromium.test/") {}
|
| void SetUp() override {
|
| web::WebTestWithWebController::SetUp();
|
| - LoadHtml(@"<html><body></body></html>", page_url_);
|
| + LoadHtml(@"<html><body></body></html>");
|
| web_delegate_mock_.reset(
|
| [[OCMockObject mockForProtocol:@protocol(CRWWebDelegate)] retain]);
|
| [web_controller() setDelegate:web_delegate_mock_];
|
| - web_state()->SetDelegate(&test_web_delegate_);
|
| + id ui_delegate_oc_mock =
|
| + [OCMockObject mockForProtocol:@protocol(CRWWebUserInterfaceDelegate)];
|
| + ui_delegate_mock_.reset([[CRWWebUserInterfaceDelegateStub alloc]
|
| + initWithRepresentedObject:ui_delegate_oc_mock]);
|
| + [web_controller() setUIDelegate:ui_delegate_mock_];
|
| + // Web Controller cancels all dialogs on |close|.
|
| + [[ui_delegate_mock_ stub] cancelDialogsForWebController:web_controller()];
|
| }
|
| void TearDown() override {
|
| WaitForBackgroundTasks();
|
| EXPECT_OCMOCK_VERIFY(web_delegate_mock_);
|
| + EXPECT_OCMOCK_VERIFY(ui_delegate_mock_);
|
| [web_controller() setDelegate:nil];
|
| - web_state()->SetDelegate(nullptr);
|
| + [web_controller() setUIDelegate:nil];
|
|
|
| web::WebTestWithWebController::TearDown();
|
| }
|
| + // Returns CRWWebDelegate mock object.
|
| id web_delegate_mock() { return web_delegate_mock_; };
|
| - web::TestJavaScriptDialogPresenter* js_dialog_presenter() {
|
| - return test_web_delegate_.GetTestJavaScriptDialogPresenter();
|
| - }
|
| - const std::vector<web::TestJavaScriptDialog>& requested_dialogs() {
|
| - return js_dialog_presenter()->requested_dialogs();
|
| - }
|
| - const GURL& page_url() { return page_url_; }
|
| + // Returns CRWWebUserInterfaceDelegate mock object.
|
| + id ui_delegate_mock() { return ui_delegate_mock_; };
|
|
|
| private:
|
| - web::TestWebStateDelegate test_web_delegate_;
|
| + // Mocks CRWWebDelegate object.
|
| base::scoped_nsprotocol<id> web_delegate_mock_;
|
| - GURL page_url_;
|
| + // Mocks CRWWebUserInterfaceDelegate object.
|
| + base::scoped_nsprotocol<id> ui_delegate_mock_;
|
| };
|
|
|
| // Tests that window.alert dialog is suppressed for DIALOG_POLICY_SUPPRESS.
|
| @@ -445,98 +503,109 @@
|
|
|
| // Tests that window.alert dialog is shown for DIALOG_POLICY_ALLOW.
|
| TEST_F(CRWWebControllerPageDialogOpenPolicyTest, AllowAlert) {
|
| - ASSERT_TRUE(requested_dialogs().empty());
|
| + SEL selector = @selector(webController:
|
| + runJavaScriptAlertPanelWithMessage:
|
| + requestURL:
|
| + completionHandler:);
|
| + [ui_delegate_mock() onSelector:selector
|
| + callBlockExpectation:^(CRWWebController* controller,
|
| + NSString* message, const GURL& url,
|
| + ProceduralBlock completion_handler) {
|
| + EXPECT_NSEQ(web_controller(), controller);
|
| + EXPECT_NSEQ(@"test", message);
|
| + web::URLVerificationTrustLevel unused;
|
| + EXPECT_EQ([controller currentURLWithTrustLevel:&unused], url);
|
| + completion_handler();
|
| + }];
|
|
|
| [web_controller() setShouldSuppressDialogs:NO];
|
| ExecuteJavaScript(@"alert('test')");
|
| -
|
| - ASSERT_EQ(1U, requested_dialogs().size());
|
| - web::TestJavaScriptDialog dialog = requested_dialogs()[0];
|
| - EXPECT_EQ(web_state(), dialog.web_state);
|
| - EXPECT_EQ(page_url(), dialog.origin_url);
|
| - EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_ALERT, dialog.java_script_dialog_type);
|
| - EXPECT_NSEQ(@"test", dialog.message_text);
|
| - EXPECT_FALSE(dialog.default_prompt_text);
|
| };
|
|
|
| // Tests that window.confirm dialog is suppressed for DIALOG_POLICY_SUPPRESS.
|
| TEST_F(CRWWebControllerPageDialogOpenPolicyTest, SuppressConfirm) {
|
| - ASSERT_TRUE(requested_dialogs().empty());
|
| -
|
| [[web_delegate_mock() expect]
|
| webControllerDidSuppressDialog:web_controller()];
|
| [web_controller() setShouldSuppressDialogs:YES];
|
| EXPECT_NSEQ(@NO, ExecuteJavaScript(@"confirm('test')"));
|
| -
|
| - ASSERT_TRUE(requested_dialogs().empty());
|
| };
|
|
|
| // Tests that window.confirm dialog is shown for DIALOG_POLICY_ALLOW and
|
| // it's result is true.
|
| TEST_F(CRWWebControllerPageDialogOpenPolicyTest, AllowConfirmWithTrue) {
|
| - ASSERT_TRUE(requested_dialogs().empty());
|
| -
|
| - js_dialog_presenter()->set_callback_success_argument(true);
|
| + SEL selector = @selector(webController:
|
| + runJavaScriptConfirmPanelWithMessage:
|
| + requestURL:
|
| + completionHandler:);
|
| + [ui_delegate_mock()
|
| + onSelector:selector
|
| + callBlockExpectation:^(CRWWebController* controller, NSString* message,
|
| + const GURL& url, id completion_handler) {
|
| + EXPECT_NSEQ(web_controller(), controller);
|
| + EXPECT_NSEQ(@"test", message);
|
| + web::URLVerificationTrustLevel unused;
|
| + EXPECT_EQ([controller currentURLWithTrustLevel:&unused], url);
|
| + void (^callable_block)(BOOL) = completion_handler;
|
| + callable_block(YES);
|
| + }];
|
|
|
| [web_controller() setShouldSuppressDialogs:NO];
|
| EXPECT_NSEQ(@YES, ExecuteJavaScript(@"confirm('test')"));
|
| -
|
| - ASSERT_EQ(1U, requested_dialogs().size());
|
| - web::TestJavaScriptDialog dialog = requested_dialogs()[0];
|
| - EXPECT_EQ(web_state(), dialog.web_state);
|
| - EXPECT_EQ(page_url(), dialog.origin_url);
|
| - EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_CONFIRM,
|
| - dialog.java_script_dialog_type);
|
| - EXPECT_NSEQ(@"test", dialog.message_text);
|
| - EXPECT_FALSE(dialog.default_prompt_text);
|
| }
|
|
|
| // Tests that window.confirm dialog is shown for DIALOG_POLICY_ALLOW and
|
| // it's result is false.
|
| TEST_F(CRWWebControllerPageDialogOpenPolicyTest, AllowConfirmWithFalse) {
|
| - ASSERT_TRUE(requested_dialogs().empty());
|
| + SEL selector = @selector(webController:
|
| + runJavaScriptConfirmPanelWithMessage:
|
| + requestURL:
|
| + completionHandler:);
|
| + [ui_delegate_mock()
|
| + onSelector:selector
|
| + callBlockExpectation:^(CRWWebController* controller, NSString* message,
|
| + const GURL& url, id completion_handler) {
|
| + EXPECT_NSEQ(web_controller(), controller);
|
| + EXPECT_NSEQ(@"test", message);
|
| + web::URLVerificationTrustLevel unused;
|
| + EXPECT_EQ([controller currentURLWithTrustLevel:&unused], url);
|
| + void (^callable_block)(BOOL) = completion_handler;
|
| + callable_block(NO);
|
| + }];
|
|
|
| [web_controller() setShouldSuppressDialogs:NO];
|
| EXPECT_NSEQ(@NO, ExecuteJavaScript(@"confirm('test')"));
|
| -
|
| - ASSERT_EQ(1U, requested_dialogs().size());
|
| - web::TestJavaScriptDialog dialog = requested_dialogs()[0];
|
| - EXPECT_EQ(web_state(), dialog.web_state);
|
| - EXPECT_EQ(page_url(), dialog.origin_url);
|
| - EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_CONFIRM,
|
| - dialog.java_script_dialog_type);
|
| - EXPECT_NSEQ(@"test", dialog.message_text);
|
| - EXPECT_FALSE(dialog.default_prompt_text);
|
| }
|
|
|
| // Tests that window.prompt dialog is suppressed for DIALOG_POLICY_SUPPRESS.
|
| TEST_F(CRWWebControllerPageDialogOpenPolicyTest, SuppressPrompt) {
|
| - ASSERT_TRUE(requested_dialogs().empty());
|
| -
|
| [[web_delegate_mock() expect]
|
| webControllerDidSuppressDialog:web_controller()];
|
| [web_controller() setShouldSuppressDialogs:YES];
|
| EXPECT_EQ([NSNull null], ExecuteJavaScript(@"prompt('Yes?', 'No')"));
|
| -
|
| - ASSERT_TRUE(requested_dialogs().empty());
|
| }
|
|
|
| // Tests that window.prompt dialog is shown for DIALOG_POLICY_ALLOW.
|
| TEST_F(CRWWebControllerPageDialogOpenPolicyTest, AllowPrompt) {
|
| - ASSERT_TRUE(requested_dialogs().empty());
|
| -
|
| - js_dialog_presenter()->set_callback_user_input_argument(@"Maybe");
|
| + SEL selector = @selector(webController:
|
| + runJavaScriptTextInputPanelWithPrompt:
|
| + defaultText:
|
| + requestURL:
|
| + completionHandler:);
|
| + [ui_delegate_mock() onSelector:selector
|
| + callBlockExpectation:^(CRWWebController* controller,
|
| + NSString* message, NSString* default_text,
|
| + const GURL& url, id completion_handler) {
|
| + EXPECT_NSEQ(web_controller(), controller);
|
| + EXPECT_NSEQ(@"Yes?", message);
|
| + EXPECT_NSEQ(@"No", default_text);
|
| + web::URLVerificationTrustLevel unused;
|
| + EXPECT_EQ([controller currentURLWithTrustLevel:&unused], url);
|
| + void (^callable_block)(NSString*) = completion_handler;
|
| + callable_block(@"Maybe");
|
| + }];
|
|
|
| [web_controller() setShouldSuppressDialogs:NO];
|
| EXPECT_NSEQ(@"Maybe", ExecuteJavaScript(@"prompt('Yes?', 'No')"));
|
| -
|
| - ASSERT_EQ(1U, requested_dialogs().size());
|
| - web::TestJavaScriptDialog dialog = requested_dialogs()[0];
|
| - EXPECT_EQ(web_state(), dialog.web_state);
|
| - EXPECT_EQ(page_url(), dialog.origin_url);
|
| - EXPECT_EQ(web::JAVASCRIPT_DIALOG_TYPE_PROMPT, dialog.java_script_dialog_type);
|
| - EXPECT_NSEQ(@"Yes?", dialog.message_text);
|
| - EXPECT_NSEQ(@"No", dialog.default_prompt_text);
|
| }
|
|
|
| // Tests that geolocation dialog is suppressed for DIALOG_POLICY_SUPPRESS.
|
|
|