Commit 974f14a7 authored by Kurt Horimoto's avatar Kurt Horimoto Committed by Commit Bot

[iOS] Don't show hostname for main frame JavaScript dialogs.

When dialogs are displayed from the main frame, the requesting page's
URL is already visible in the location bar, so we don't need to add
source information as the title.  The message text is used instead.

Bug: 999966
Change-Id: I6ea4f5286c2626055e0350f5746fe8968dde1dd5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1785013
Commit-Queue: Kurt Horimoto <kkhorimoto@chromium.org>
Auto-Submit: Kurt Horimoto <kkhorimoto@chromium.org>
Reviewed-by: default avatarMike Dougherty <michaeldo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#696960}
parent 23f17352
...@@ -9,6 +9,7 @@ source_set("common") { ...@@ -9,6 +9,7 @@ source_set("common") {
"java_script_dialog_overlay_coordinator+subclassing.h", "java_script_dialog_overlay_coordinator+subclassing.h",
"java_script_dialog_overlay_coordinator.h", "java_script_dialog_overlay_coordinator.h",
"java_script_dialog_overlay_coordinator.mm", "java_script_dialog_overlay_coordinator.mm",
"java_script_dialog_overlay_mediator+subclassing.h",
"java_script_dialog_overlay_mediator.h", "java_script_dialog_overlay_mediator.h",
"java_script_dialog_overlay_mediator.mm", "java_script_dialog_overlay_mediator.mm",
] ]
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" #import "ios/chrome/browser/ui/alert_view_controller/alert_action.h"
#import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h" #import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
#include "ios/chrome/grit/ios_strings.h" #include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
...@@ -27,10 +28,6 @@ ...@@ -27,10 +28,6 @@
#pragma mark - Accessors #pragma mark - Accessors
- (const JavaScriptDialogSource*)requestSource {
return &self.config->source();
}
- (JavaScriptAlertOverlayRequestConfig*)config { - (JavaScriptAlertOverlayRequestConfig*)config {
return self.request->GetConfig<JavaScriptAlertOverlayRequestConfig>(); return self.request->GetConfig<JavaScriptAlertOverlayRequestConfig>();
} }
...@@ -39,7 +36,6 @@ ...@@ -39,7 +36,6 @@
if (self.consumer == consumer) if (self.consumer == consumer)
return; return;
[super setConsumer:consumer]; [super setConsumer:consumer];
[self.consumer setMessage:base::SysUTF8ToNSString(self.config->message())];
__weak __typeof__(self) weakSelf = self; __weak __typeof__(self) weakSelf = self;
NSMutableArray* actions = [@[ [AlertAction NSMutableArray* actions = [@[ [AlertAction
actionWithTitle:l10n_util::GetNSString(IDS_OK) actionWithTitle:l10n_util::GetNSString(IDS_OK)
...@@ -54,3 +50,15 @@ ...@@ -54,3 +50,15 @@
} }
@end @end
@implementation JavaScriptAlertOverlayMediator (Subclassing)
- (const JavaScriptDialogSource&)requestSource {
return self.config->source();
}
- (const std::string&)requestMessage {
return self.config->message();
}
@end
...@@ -25,8 +25,9 @@ ...@@ -25,8 +25,9 @@
using JavaScriptAlertOverlayMediatorTest = JavaScriptDialogOverlayMediatorTest; using JavaScriptAlertOverlayMediatorTest = JavaScriptDialogOverlayMediatorTest;
// Tests that the consumer values are set correctly for alerts. // Tests that the consumer values are set correctly for alerts from the main
TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetup) { // frame.
TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetupMainFrame) {
web::TestWebState web_state; web::TestWebState web_state;
const GURL kUrl("https://chromium.test"); const GURL kUrl("https://chromium.test");
const std::string kMessage("Message"); const std::string kMessage("Message");
...@@ -37,6 +38,26 @@ TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetup) { ...@@ -37,6 +38,26 @@ TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetup) {
SetMediator( SetMediator(
[[JavaScriptAlertOverlayMediator alloc] initWithRequest:request.get()]); [[JavaScriptAlertOverlayMediator alloc] initWithRequest:request.get()]);
// Verify the consumer values.
EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().title);
EXPECT_EQ(0U, consumer().textFieldConfigurations.count);
ASSERT_EQ(1U, consumer().actions.count);
EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style);
EXPECT_NSEQ(l10n_util::GetNSString(IDS_OK), consumer().actions[0].title);
}
// Tests that the consumer values are set correctly for alerts from an iframe.
TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetupIFrame) {
web::TestWebState web_state;
const GURL kUrl("https://chromium.test");
const std::string kMessage("Message");
std::unique_ptr<OverlayRequest> request =
OverlayRequest::CreateWithConfig<JavaScriptAlertOverlayRequestConfig>(
JavaScriptDialogSource(&web_state, kUrl, /*is_main_frame=*/false),
kMessage);
SetMediator(
[[JavaScriptAlertOverlayMediator alloc] initWithRequest:request.get()]);
// Verify the consumer values. // Verify the consumer values.
EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().message); EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().message);
EXPECT_EQ(0U, consumer().textFieldConfigurations.count); EXPECT_EQ(0U, consumer().textFieldConfigurations.count);
...@@ -63,7 +84,7 @@ TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetupWithBlockingOption) { ...@@ -63,7 +84,7 @@ TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetupWithBlockingOption) {
[[JavaScriptAlertOverlayMediator alloc] initWithRequest:request.get()]); [[JavaScriptAlertOverlayMediator alloc] initWithRequest:request.get()]);
// Verify the consumer values. // Verify the consumer values.
EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().message); EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().title);
EXPECT_EQ(0U, consumer().textFieldConfigurations.count); EXPECT_EQ(0U, consumer().textFieldConfigurations.count);
ASSERT_EQ(2U, consumer().actions.count); ASSERT_EQ(2U, consumer().actions.count);
EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style); EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style);
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#import "ios/chrome/browser/ui/alert_view_controller/alert_action.h" #import "ios/chrome/browser/ui/alert_view_controller/alert_action.h"
#import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h" #import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
#include "ios/chrome/grit/ios_strings.h" #include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
...@@ -29,10 +30,6 @@ ...@@ -29,10 +30,6 @@
#pragma mark - Accessors #pragma mark - Accessors
- (const JavaScriptDialogSource*)requestSource {
return &self.config->source();
}
- (JavaScriptConfirmationOverlayRequestConfig*)config { - (JavaScriptConfirmationOverlayRequestConfig*)config {
return self.request->GetConfig<JavaScriptConfirmationOverlayRequestConfig>(); return self.request->GetConfig<JavaScriptConfirmationOverlayRequestConfig>();
} }
...@@ -41,7 +38,6 @@ ...@@ -41,7 +38,6 @@
if (self.consumer == consumer) if (self.consumer == consumer)
return; return;
[super setConsumer:consumer]; [super setConsumer:consumer];
[self.consumer setMessage:base::SysUTF8ToNSString(self.config->message())];
__weak __typeof__(self) weakSelf = self; __weak __typeof__(self) weakSelf = self;
NSMutableArray* actions = [@[ NSMutableArray* actions = [@[
[AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK) [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK)
...@@ -77,3 +73,15 @@ ...@@ -77,3 +73,15 @@
} }
@end @end
@implementation JavaScriptConfirmationOverlayMediator (Subclassing)
- (const JavaScriptDialogSource&)requestSource {
return self.config->source();
}
- (const std::string&)requestMessage {
return self.config->message();
}
@end
...@@ -33,11 +33,10 @@ class JavaScriptConfirmationOverlayMediatorTest ...@@ -33,11 +33,10 @@ class JavaScriptConfirmationOverlayMediatorTest
} }
// Creates a mediator and sets it for testing. // Creates a mediator and sets it for testing.
void CreateMediator() { void CreateMediator(bool is_main_frame = true) {
request_ = OverlayRequest::CreateWithConfig< request_ = OverlayRequest::CreateWithConfig<
JavaScriptConfirmationOverlayRequestConfig>( JavaScriptConfirmationOverlayRequestConfig>(
JavaScriptDialogSource(&web_state_, url_, /*is_main_frame=*/true), JavaScriptDialogSource(&web_state_, url_, is_main_frame), message_);
message_);
SetMediator([[JavaScriptConfirmationOverlayMediator alloc] SetMediator([[JavaScriptConfirmationOverlayMediator alloc]
initWithRequest:request_.get()]); initWithRequest:request_.get()]);
} }
...@@ -56,10 +55,26 @@ class JavaScriptConfirmationOverlayMediatorTest ...@@ -56,10 +55,26 @@ class JavaScriptConfirmationOverlayMediatorTest
std::unique_ptr<OverlayRequest> request_; std::unique_ptr<OverlayRequest> request_;
}; };
// Tests that the consumer values are set correctly for confirmations. // Tests that the consumer values are set correctly for confirmations from the
TEST_F(JavaScriptConfirmationOverlayMediatorTest, ConfirmationSetup) { // main frame.
TEST_F(JavaScriptConfirmationOverlayMediatorTest, ConfirmationSetupMainFrame) {
CreateMediator(); CreateMediator();
// Verify the consumer values.
EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().title);
EXPECT_EQ(0U, consumer().textFieldConfigurations.count);
ASSERT_EQ(2U, consumer().actions.count);
EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style);
EXPECT_NSEQ(l10n_util::GetNSString(IDS_OK), consumer().actions[0].title);
EXPECT_EQ(UIAlertActionStyleCancel, consumer().actions[1].style);
EXPECT_NSEQ(l10n_util::GetNSString(IDS_CANCEL), consumer().actions[1].title);
}
// Tests that the consumer values are set correctly for confirmations from
// iframes.
TEST_F(JavaScriptConfirmationOverlayMediatorTest, ConfirmationSetupIFrame) {
CreateMediator(/*is_main_frame=*/false);
// Verify the consumer values. // Verify the consumer values.
EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().message); EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().message);
EXPECT_EQ(0U, consumer().textFieldConfigurations.count); EXPECT_EQ(0U, consumer().textFieldConfigurations.count);
...@@ -78,7 +93,7 @@ TEST_F(JavaScriptConfirmationOverlayMediatorTest, ...@@ -78,7 +93,7 @@ TEST_F(JavaScriptConfirmationOverlayMediatorTest,
CreateMediator(); CreateMediator();
// Verify the consumer values. // Verify the consumer values.
EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().message); EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().title);
EXPECT_EQ(0U, consumer().textFieldConfigurations.count); EXPECT_EQ(0U, consumer().textFieldConfigurations.count);
ASSERT_EQ(3U, consumer().actions.count); ASSERT_EQ(3U, consumer().actions.count);
EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style); EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/logging.h" #include "base/logging.h"
#include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h" #include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h"
#import "ios/chrome/browser/ui/dialogs/java_script_dialog_blocking_state.h" #import "ios/chrome/browser/ui/dialogs/java_script_dialog_blocking_state.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
#include "ios/chrome/grit/ios_strings.h" #include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
...@@ -19,8 +20,8 @@ namespace { ...@@ -19,8 +20,8 @@ namespace {
// Returns the blocking state for |source|'s WebState, or nullptr if the // Returns the blocking state for |source|'s WebState, or nullptr if the
// WebState was destroyed. // WebState was destroyed.
JavaScriptDialogBlockingState* GetBlockingState( JavaScriptDialogBlockingState* GetBlockingState(
const JavaScriptDialogSource* source) { const JavaScriptDialogSource& source) {
web::WebState* web_state = source->web_state(); web::WebState* web_state = source.web_state();
if (!web_state) if (!web_state)
return nullptr; return nullptr;
JavaScriptDialogBlockingState::CreateForWebState(web_state); JavaScriptDialogBlockingState::CreateForWebState(web_state);
...@@ -29,7 +30,7 @@ JavaScriptDialogBlockingState* GetBlockingState( ...@@ -29,7 +30,7 @@ JavaScriptDialogBlockingState* GetBlockingState(
} // namespace } // namespace
AlertAction* GetBlockingAlertAction(JavaScriptDialogOverlayMediator* mediator) { AlertAction* GetBlockingAlertAction(JavaScriptDialogOverlayMediator* mediator) {
const JavaScriptDialogSource* source = mediator.requestSource; const JavaScriptDialogSource& source = mediator.requestSource;
JavaScriptDialogBlockingState* blocking_state = GetBlockingState(source); JavaScriptDialogBlockingState* blocking_state = GetBlockingState(source);
if (!blocking_state || !blocking_state->show_blocking_option()) if (!blocking_state || !blocking_state->show_blocking_option())
return nil; return nil;
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_SUBCLASSING_H_
#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_SUBCLASSING_H_
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
class JavaScriptDialogSource;
// Category used by JavaScriptDialogOverlayMediator subclasses to provide
// information from their OverlayRequests.
@interface JavaScriptDialogOverlayMediator (Subclassing)
// Returns the source for the OverlayRequest.
@property(nonatomic, readonly) const JavaScriptDialogSource& requestSource;
// Returns the message for the OverlayRequest.
@property(nonatomic, readonly) const std::string& requestMessage;
@end
#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_SUBCLASSING_H_
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
class OverlayRequest; class OverlayRequest;
class JavaScriptDialogSource;
@protocol AlertConsumer; @protocol AlertConsumer;
@protocol JavaScriptDialogOverlayMediatorDelegate; @protocol JavaScriptDialogOverlayMediatorDelegate;
...@@ -19,9 +18,6 @@ class JavaScriptDialogSource; ...@@ -19,9 +18,6 @@ class JavaScriptDialogSource;
// The request passed on initialization. // The request passed on initialization.
@property(nonatomic, readonly) OverlayRequest* request; @property(nonatomic, readonly) OverlayRequest* request;
// Returns the source for the OverlayRequest.
@property(nonatomic, readonly) const JavaScriptDialogSource* requestSource;
// The consumer to be updated by this mediator. Setting to a new value uses the // The consumer to be updated by this mediator. Setting to a new value uses the
// configuration data in |request| to update the new consumer. // configuration data in |request| to update the new consumer.
@property(nonatomic, weak) id<AlertConsumer> consumer; @property(nonatomic, weak) id<AlertConsumer> consumer;
......
...@@ -5,10 +5,12 @@ ...@@ -5,10 +5,12 @@
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
#include "base/logging.h" #include "base/logging.h"
#import "base/strings/sys_string_conversions.h"
#include "components/strings/grit/components_strings.h" #include "components/strings/grit/components_strings.h"
#include "components/url_formatter/elide_url.h" #include "components/url_formatter/elide_url.h"
#include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h" #include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h"
#import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h" #import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
#include "ios/chrome/grit/ios_strings.h" #include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
...@@ -28,11 +30,6 @@ ...@@ -28,11 +30,6 @@
#pragma mark - Accessors #pragma mark - Accessors
- (const JavaScriptDialogSource*)requestSource {
NOTREACHED() << "Subclasses must implement.";
return nullptr;
}
- (void)setConsumer:(id<AlertConsumer>)consumer { - (void)setConsumer:(id<AlertConsumer>)consumer {
if (_consumer == consumer) if (_consumer == consumer)
return; return;
...@@ -40,18 +37,18 @@ ...@@ -40,18 +37,18 @@
if (!_consumer) if (!_consumer)
return; return;
const JavaScriptDialogSource* source = self.requestSource; NSString* requestMessage = base::SysUTF8ToNSString(self.requestMessage);
NSString* consumerTitle = nil; if (self.requestSource.is_main_frame()) {
if (source->is_main_frame()) { // If the requesting page's URL is already displayed in the location bar,
base::string16 title = url_formatter::FormatUrlForSecurityDisplay( // there is no need to add information about the request source. Instead,
source->url(), url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS); // show the request's message text as the alert's title.
consumerTitle = [_consumer setTitle:requestMessage];
l10n_util::GetNSStringF(IDS_JAVASCRIPT_MESSAGEBOX_TITLE, title);
} else { } else {
consumerTitle = l10n_util::GetNSString( [_consumer
IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME); setTitle:l10n_util::GetNSString(
IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME)];
[_consumer setMessage:requestMessage];
} }
[_consumer setTitle:consumerTitle];
} }
@end @end
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h" #include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h"
#include "ios/chrome/browser/overlays/test/fake_overlay_user_data.h" #include "ios/chrome/browser/overlays/test/fake_overlay_user_data.h"
#import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h" #import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h"
#include "ios/chrome/grit/ios_strings.h" #include "ios/chrome/grit/ios_strings.h"
#import "ios/web/public/test/fakes/test_web_state.h" #import "ios/web/public/test/fakes/test_web_state.h"
...@@ -26,22 +27,26 @@ ...@@ -26,22 +27,26 @@
: JavaScriptDialogOverlayMediator { : JavaScriptDialogOverlayMediator {
web::TestWebState _webState; web::TestWebState _webState;
std::unique_ptr<JavaScriptDialogSource> _source; std::unique_ptr<JavaScriptDialogSource> _source;
std::string _message;
} }
// Initializer for a mediator that has a JavaScriptDialogSource with |sourceURL| // Initializer for a mediator that has a JavaScriptDialogSource with |sourceURL|
// and |isMainFrame|. // and |isMainFrame|. |message| is the dialog's message text.
- (instancetype)initWithRequest:(OverlayRequest*)request - (instancetype)initWithRequest:(OverlayRequest*)request
sourceURL:(const GURL&)sourceURL sourceURL:(const GURL&)sourceURL
isMainFrame:(BOOL)isMainFrame; isMainFrame:(BOOL)isMainFrame
message:(const std::string&)message;
@end @end
@implementation FakeJavaScriptDialogOverlayMediator @implementation FakeJavaScriptDialogOverlayMediator
- (instancetype)initWithRequest:(OverlayRequest*)request - (instancetype)initWithRequest:(OverlayRequest*)request
sourceURL:(const GURL&)sourceURL sourceURL:(const GURL&)sourceURL
isMainFrame:(BOOL)isMainFrame { isMainFrame:(BOOL)isMainFrame
message:(const std::string&)message {
if (self = [super initWithRequest:request]) { if (self = [super initWithRequest:request]) {
_source = std::make_unique<JavaScriptDialogSource>(&_webState, sourceURL, _source = std::make_unique<JavaScriptDialogSource>(&_webState, sourceURL,
isMainFrame); isMainFrame);
_message = message;
} }
return self; return self;
} }
...@@ -50,8 +55,12 @@ ...@@ -50,8 +55,12 @@
@implementation FakeJavaScriptDialogOverlayMediator (Subclassing) @implementation FakeJavaScriptDialogOverlayMediator (Subclassing)
- (const JavaScriptDialogSource*)requestSource { - (const JavaScriptDialogSource&)requestSource {
return _source.get(); return *_source.get();
}
- (const std::string&)requestMessage {
return _message;
} }
@end @end
...@@ -59,34 +68,38 @@ ...@@ -59,34 +68,38 @@
// Test fixture for JavaScriptDialogOverlayMediator. // Test fixture for JavaScriptDialogOverlayMediator.
using JavaScriptDialogOverlayMediatorTest = JavaScriptDialogOverlayMediatorTest; using JavaScriptDialogOverlayMediatorTest = JavaScriptDialogOverlayMediatorTest;
// Tests the title for a JavaScript dialog from the main frame. // Tests the JavaScript dialog setup from the main frame.
TEST_F(JavaScriptDialogOverlayMediatorTest, MainFrameTitle) { TEST_F(JavaScriptDialogOverlayMediatorTest, MainFrame) {
std::unique_ptr<OverlayRequest> request = std::unique_ptr<OverlayRequest> request =
OverlayRequest::CreateWithConfig<FakeOverlayUserData>(nullptr); OverlayRequest::CreateWithConfig<FakeOverlayUserData>(nullptr);
const GURL kUrl("https://chromium.org"); const GURL kUrl("https://chromium.org");
const std::string kMessage("Message");
SetMediator([[FakeJavaScriptDialogOverlayMediator alloc] SetMediator([[FakeJavaScriptDialogOverlayMediator alloc]
initWithRequest:request.get() initWithRequest:request.get()
sourceURL:kUrl sourceURL:kUrl
isMainFrame:YES]); isMainFrame:YES
message:kMessage]);
base::string16 title = url_formatter::FormatUrlForSecurityDisplay( // For the main frame, the URL is already displayed in the location bar, so
kUrl, url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS); // there is no need to add source information. The message is used as the
NSString* expected_title = // consumer's title in this case.
l10n_util::GetNSStringF(IDS_JAVASCRIPT_MESSAGEBOX_TITLE, title); EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().title);
EXPECT_NSEQ(expected_title, consumer().title);
} }
// Tests the title for a JavaScript dialog from the main frame. // Tests the JavaScript dialog setup from an iframe.
TEST_F(JavaScriptDialogOverlayMediatorTest, IFrameTitle) { TEST_F(JavaScriptDialogOverlayMediatorTest, IFrameSetup) {
std::unique_ptr<OverlayRequest> request = std::unique_ptr<OverlayRequest> request =
OverlayRequest::CreateWithConfig<FakeOverlayUserData>(nullptr); OverlayRequest::CreateWithConfig<FakeOverlayUserData>(nullptr);
const GURL kUrl("https://chromium.org"); const GURL kUrl("https://chromium.org");
const std::string kMessage("Message");
SetMediator([[FakeJavaScriptDialogOverlayMediator alloc] SetMediator([[FakeJavaScriptDialogOverlayMediator alloc]
initWithRequest:request.get() initWithRequest:request.get()
sourceURL:kUrl sourceURL:kUrl
isMainFrame:NO]); isMainFrame:NO
message:kMessage]);
NSString* expected_title = l10n_util::GetNSString( NSString* expected_title = l10n_util::GetNSString(
IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME); IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME);
EXPECT_NSEQ(expected_title, consumer().title); EXPECT_NSEQ(expected_title, consumer().title);
EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().message);
} }
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h" #import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h" #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
#include "ios/chrome/grit/ios_strings.h" #include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
...@@ -34,10 +35,6 @@ NSString* const kJavaScriptPromptTextFieldAccessibiltyIdentifier = ...@@ -34,10 +35,6 @@ NSString* const kJavaScriptPromptTextFieldAccessibiltyIdentifier =
#pragma mark - Accessors #pragma mark - Accessors
- (const JavaScriptDialogSource*)requestSource {
return &self.config->source();
}
- (JavaScriptPromptOverlayRequestConfig*)config { - (JavaScriptPromptOverlayRequestConfig*)config {
return self.request->GetConfig<JavaScriptPromptOverlayRequestConfig>(); return self.request->GetConfig<JavaScriptPromptOverlayRequestConfig>();
} }
...@@ -91,3 +88,15 @@ NSString* const kJavaScriptPromptTextFieldAccessibiltyIdentifier = ...@@ -91,3 +88,15 @@ NSString* const kJavaScriptPromptTextFieldAccessibiltyIdentifier =
} }
@end @end
@implementation JavaScriptPromptOverlayMediator (Subclassing)
- (const JavaScriptDialogSource&)requestSource {
return self.config->source();
}
- (const std::string&)requestMessage {
return self.config->message();
}
@end
...@@ -88,8 +88,28 @@ class JavaScriptPromptOverlayMediatorTest ...@@ -88,8 +88,28 @@ class JavaScriptPromptOverlayMediatorTest
FakePromptOverlayMediatorDataSource* data_source_ = nil; FakePromptOverlayMediatorDataSource* data_source_ = nil;
}; };
// Tests that the consumer values are set correctly for main frame prompts. // Tests that the consumer values are set correctly for main frame prompts from
TEST_F(JavaScriptPromptOverlayMediatorTest, PromptSetup) { // the main frame.
TEST_F(JavaScriptPromptOverlayMediatorTest, PromptSetupMainFrame) {
CreateMediator();
// Verify the consumer values.
EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().title);
ASSERT_EQ(1U, consumer().textFieldConfigurations.count);
EXPECT_NSEQ(base::SysUTF8ToNSString(default_prompt_value()),
consumer().textFieldConfigurations[0].text);
EXPECT_FALSE(!!consumer().textFieldConfigurations[0].placeholder);
EXPECT_NSEQ(kJavaScriptPromptTextFieldAccessibiltyIdentifier,
consumer().textFieldConfigurations[0].accessibilityIdentifier);
ASSERT_EQ(2U, consumer().actions.count);
EXPECT_EQ(UIAlertActionStyleDefault, consumer().actions[0].style);
EXPECT_NSEQ(l10n_util::GetNSString(IDS_OK), consumer().actions[0].title);
EXPECT_EQ(UIAlertActionStyleCancel, consumer().actions[1].style);
EXPECT_NSEQ(l10n_util::GetNSString(IDS_CANCEL), consumer().actions[1].title);
}
// Tests that the consumer values are set correctly for prompts from iframes.
TEST_F(JavaScriptPromptOverlayMediatorTest, PromptSetupIframe) {
CreateMediator(); CreateMediator();
// Verify the consumer values. // Verify the consumer values.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment