Commit 680104ad authored by Kurt Horimoto's avatar Kurt Horimoto Committed by Commit Bot

[iOS] Add JavaScript alert overlay UI classes.

This CL adds the classes to support showing JS alerts
via OverlayPresenter, and adds the alert coordinator
to the OverlayModality::kWebContentArea supported
classes list.

Bug: 941745
Change-Id: I8fe4986cadedf80cb673d9b5f311f1320318af02
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1639517
Commit-Queue: Kurt Horimoto <kkhorimoto@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Cr-Commit-Position: refs/heads/master@{#667259}
parent 4281cef2
......@@ -15,5 +15,6 @@ source_set("web_content_area") {
deps = [
"//base",
"//ios/chrome/browser/ui/overlays:coordinators",
"//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:alerts",
]
}
......@@ -28,15 +28,42 @@ source_set("common") {
]
}
source_set("alerts") {
sources = [
"java_script_alert_overlay_coordinator.h",
"java_script_alert_overlay_coordinator.mm",
"java_script_alert_overlay_mediator.h",
"java_script_alert_overlay_mediator.mm",
]
configs += [ "//build/config/compiler:enable_arc" ]
deps = [
":common",
"//base",
"//components/strings:components_strings_grit",
"//ios/chrome/app/strings:ios_strings_grit",
"//ios/chrome/browser/overlays",
"//ios/chrome/browser/overlays/public/web_content_area",
"//ios/chrome/browser/ui/alert_view_controller",
"//ios/chrome/browser/ui/elements",
"//ios/chrome/browser/ui/overlays:coordinators",
"//ui/base",
]
}
source_set("unit_tests") {
testonly = true
sources = [
"java_script_alert_overlay_coordinator_unittest.mm",
"java_script_alert_overlay_mediator_unittest.mm",
"java_script_dialog_overlay_mediator_unittest.mm",
]
configs += [ "//build/config/compiler:enable_arc" ]
deps = [
":alerts",
":common",
"//base/test:test_support",
"//components/strings:components_strings_grit",
......
// 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_ALERT_OVERLAY_COORDINATOR_H_
#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_COORDINATOR_H_
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h"
// An OverlayCoordinator that displays the UI for JavaScript alerts.
@interface JavaScriptAlertOverlayCoordinator
: JavaScriptDialogOverlayCoordinator
@end
#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_COORDINATOR_H_
// 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.
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h"
#import "ios/chrome/browser/overlays/public/overlay_request.h"
#import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@implementation JavaScriptAlertOverlayCoordinator
#pragma mark - OverlayRequestCoordinator
+ (BOOL)supportsRequest:(OverlayRequest*)request {
return !!request->GetConfig<JavaScriptAlertOverlayRequestConfig>();
}
@end
@implementation JavaScriptAlertOverlayCoordinator (Subclassing)
- (JavaScriptDialogOverlayMediator*)newMediator {
return [[JavaScriptAlertOverlayMediator alloc] initWithRequest:self.request];
}
@end
// 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.
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h"
#import "base/test/ios/wait_util.h"
#import "ios/chrome/browser/overlays/public/overlay_request.h"
#import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.h"
#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using base::test::ios::kWaitForUIElementTimeout;
using base::test::ios::WaitUntilConditionOrTimeout;
// Test fixture for JavaScriptAlertOverlayCoordinator.
using JavaScriptAlertOverlayCoordinatorTest =
JavaScriptDialogOverlayCoordinatorTest;
// Tests that JavaScriptAlertOverlayCoordinator creates an alert and presents it
// non-modally.
TEST_F(JavaScriptAlertOverlayCoordinatorTest, StartAndStop) {
std::unique_ptr<OverlayRequest> passed_request =
OverlayRequest::CreateWithConfig<JavaScriptAlertOverlayRequestConfig>(
GURL("https://chromium.test"), /*is_main_frame=*/true,
"Message Text");
OverlayRequest* request = passed_request.get();
SetRequest(std::move(passed_request));
// Start the coordinator and verify that the alert is shown.
StartDialogCoordinator();
__weak UIViewController* alert = GetAlertViewController();
EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
return !!alert.presentingViewController && !alert.beingPresented;
}));
// Stop the coordinator and verify that the alert is dismissed and that the
// dismissal delegate is notified.
StopDialogCoordinator();
EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
return !alert.presentingViewController;
}));
EXPECT_TRUE(dismissal_delegate().HasUIBeenDismissed(request));
}
// 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_ALERT_OVERLAY_MEDIATOR_H_
#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_MEDIATOR_H_
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
// Mediator object that uses a JavaScriptAlertOverlayRequestConfig to set up the
// UI for a JavaScript alert overlay.
@interface JavaScriptAlertOverlayMediator : JavaScriptDialogOverlayMediator
@end
#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_MEDIATOR_H_
// 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.
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h"
#include "base/strings/sys_string_conversions.h"
#include "components/strings/grit/components_strings.h"
#import "ios/chrome/browser/overlays/public/overlay_request.h"
#import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.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/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
#include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface JavaScriptAlertOverlayMediator ()
// The alert config.
@property(nonatomic, readonly) JavaScriptAlertOverlayRequestConfig* config;
@end
@implementation JavaScriptAlertOverlayMediator
#pragma mark - Accessors
- (JavaScriptAlertOverlayRequestConfig*)config {
return self.request->GetConfig<JavaScriptAlertOverlayRequestConfig>();
}
- (void)setConsumer:(id<AlertConsumer>)consumer {
if (self.consumer == consumer)
return;
[super setConsumer:consumer];
[self.consumer setMessage:base::SysUTF8ToNSString(self.config->message())];
__weak __typeof__(self) weakSelf = self;
[self.consumer setActions:@[
[AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK)
style:UIAlertActionStyleDefault
handler:^(AlertAction* action) {
[weakSelf.delegate stopDialogForMediator:weakSelf];
}],
]];
}
@end
@implementation JavaScriptAlertOverlayMediator (Subclassing)
- (const JavaScriptDialogSource*)requestSource {
return &self.config->source();
}
@end
// 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.
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h"
#include "base/strings/sys_string_conversions.h"
#include "components/strings/grit/components_strings.h"
#include "components/url_formatter/elide_url.h"
#import "ios/chrome/browser/overlays/public/overlay_request.h"
#import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.h"
#import "ios/chrome/browser/ui/alert_view_controller/alert_action.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.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 "testing/gtest_mac.h"
#include "ui/base/l10n/l10n_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using JavaScriptAlertOverlayMediatorTest = JavaScriptDialogOverlayMediatorTest;
// Tests that the consumer values are set correctly for alerts.
TEST_F(JavaScriptAlertOverlayMediatorTest, AlertSetup) {
const GURL kUrl("https://chromium.test");
const std::string kMessage("Message");
std::unique_ptr<OverlayRequest> request =
OverlayRequest::CreateWithConfig<JavaScriptAlertOverlayRequestConfig>(
kUrl, /*is_main_frame=*/true, kMessage);
SetMediator(
[[JavaScriptAlertOverlayMediator alloc] initWithRequest:request.get()]);
// Verify the consumer values.
EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().message);
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);
}
......@@ -24,6 +24,7 @@ source_set("test") {
"//ios/chrome/browser/ui/overlays",
"//ios/chrome/browser/ui/overlays:coordinators",
"//ios/chrome/browser/ui/overlays/test",
"//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:alerts",
"//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:common",
"//ios/chrome/browser/web_state_list",
"//ios/chrome/browser/web_state_list:test_support",
......
......@@ -8,6 +8,7 @@
#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h"
#import "ios/chrome/browser/ui/overlays/overlay_coordinator_factory+initialization.h"
#import "ios/chrome/browser/ui/overlays/overlay_request_coordinator.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
......@@ -35,8 +36,8 @@ void JavaScriptDialogOverlayCoordinatorTest::SetRequest(
DCHECK(!request_);
DCHECK(request);
request_ = std::move(request);
// TODO(crbug.com/941745): Add supported overlay coordinator classes.
NSArray<Class>* coordinator_classes = @[];
NSArray<Class>* coordinator_classes =
@ [[JavaScriptAlertOverlayCoordinator class]];
OverlayRequestCoordinatorFactory* factory =
[[OverlayRequestCoordinatorFactory alloc]
initWithBrowser:browser_.get()
......
......@@ -4,6 +4,8 @@
#import "ios/chrome/browser/ui/overlays/web_content_area/web_content_area_supported_overlay_coordinator_classes.h"
#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
......@@ -12,7 +14,7 @@ namespace web_content_area {
NSArray<Class>* GetSupportedOverlayCoordinatorClasses() {
// TODO(crbug.com/941745): Add more supported overlay coordinator classes.
return @[];
return @ [[JavaScriptAlertOverlayCoordinator class]];
}
} // web_content_area
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