Commit 105a222b authored by Ewann's avatar Ewann Committed by Commit Bot

Create the mediator and the description class of the page info

The mediator now uses a new class 'description' which creates the data
to be displayed.
The mediator creates the description object, once created, the mediator
sends the data of the description to the coordinator.

Bug: 1038919
Change-Id: Ia0b27621bd25f0dbe5f990f46df03ce96fe0ec47
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2087335
Commit-Queue: Ewann Pellé <ewannpv@chromium.org>
Reviewed-by: default avatarSylvain Defresne <sdefresne@chromium.org>
Reviewed-by: default avatarGauthier Ambard <gambard@chromium.org>
Cr-Commit-Position: refs/heads/master@{#747647}
parent 592dc9e4
...@@ -9,6 +9,9 @@ source_set("page_info") { ...@@ -9,6 +9,9 @@ source_set("page_info") {
"legacy_page_info_view_controller.mm", "legacy_page_info_view_controller.mm",
"page_info_config.h", "page_info_config.h",
"page_info_config.mm", "page_info_config.mm",
"page_info_consumer.h",
"page_info_description.h",
"page_info_description.mm",
"page_info_view_controller.h", "page_info_view_controller.h",
"page_info_view_controller.mm", "page_info_view_controller.mm",
] ]
...@@ -66,6 +69,8 @@ source_set("coordinator") { ...@@ -66,6 +69,8 @@ source_set("coordinator") {
"page_info_coordinator.mm", "page_info_coordinator.mm",
"page_info_legacy_coordinator.h", "page_info_legacy_coordinator.h",
"page_info_legacy_coordinator.mm", "page_info_legacy_coordinator.mm",
"page_info_mediator.h",
"page_info_mediator.mm",
] ]
deps = [ deps = [
":page_info", ":page_info",
......
// Copyright 2020 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_PAGE_INFO_PAGE_INFO_CONSUMER_H_
#define IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_CONSUMER_H_
#import "ios/chrome/browser/ui/page_info/page_info_description.h"
// A consumer for page info changes.
@protocol PageInfoConsumer
// Called when the page info has changed.
- (void)pageInfoChanged:(PageInfoDescription*)pageInfoDescription;
@end
#endif // IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_CONSUMER_H_
...@@ -7,14 +7,17 @@ ...@@ -7,14 +7,17 @@
#include "base/logging.h" #include "base/logging.h"
#include "ios/chrome/browser/main/browser.h" #include "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#import "ios/chrome/browser/ui/page_info/page_info_mediator.h"
#import "ios/chrome/browser/ui/page_info/page_info_view_controller.h" #import "ios/chrome/browser/ui/page_info/page_info_view_controller.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
@interface PageInfoCoordinator () @interface PageInfoCoordinator ()
@property(nonatomic, strong) PageInfoViewController* viewController;
@property(nonatomic, strong) PageInfoMediator* mediator;
@end @end
@implementation PageInfoCoordinator @implementation PageInfoCoordinator
...@@ -24,11 +27,27 @@ ...@@ -24,11 +27,27 @@
#pragma mark - ChromeCoordinator #pragma mark - ChromeCoordinator
- (void)start { - (void)start {
// TODO(crbug.com/1038919): Implement this. self.viewController = [[PageInfoViewController alloc] init];
web::WebState* webState =
self.browser->GetWebStateList()->GetActiveWebState();
self.mediator = [[PageInfoMediator alloc] initWithWebState:webState];
self.mediator.consumer = self.viewController;
UINavigationController* navController = [[UINavigationController alloc]
initWithRootViewController:self.viewController];
[self.baseViewController presentViewController:navController
animated:YES
completion:nil];
} }
- (void)stop { - (void)stop {
// TODO(crbug.com/1038919): Implement this. [self.baseViewController.presentingViewController
dismissViewControllerAnimated:YES
completion:nil];
self.mediator.consumer = nil;
self.mediator = nil;
self.viewController = nil;
} }
@end @end
// Copyright 2020 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_PAGE_INFO_PAGE_INFO_DESCRIPTION_H_
#define IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_DESCRIPTION_H_
#import <UIKit/UIKit.h>
class GURL;
namespace web {
struct SSLStatus;
}
// Create and store all the data to be displayed inside the root of the page
// info.
@interface PageInfoDescription : NSObject
// Init based on the |URL|, the SSL |status| and if the current page is an
// |offlinePage|.
- (instancetype)initWithURL:(const GURL&)URL
SSLStatus:(const web::SSLStatus&)status
isPageOffline:(BOOL)isOffline NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
// Describes the security status of this page, i.e. "Page is secure" or "SSL
// cert expired".
@property(nonatomic, readonly) NSString* pageSecurityStatusDescription;
// The icon name for the page security status, e.g. a lock.
@property(nonatomic, readonly) NSString* pageSecurityStatusIconImageName;
@end
#endif // IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_DESCRIPTION_H_
// Copyright 2020 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/page_info/page_info_description.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "components/security_state/core/security_state.h"
#include "components/strings/grit/components_chromium_strings.h"
#include "components/strings/grit/components_google_chrome_strings.h"
#include "components/strings/grit/components_strings.h"
#include "ios/chrome/browser/chrome_url_constants.h"
#include "ios/chrome/grit/ios_strings.h"
#include "ios/web/public/security/ssl_status.h"
#include "ui/base/l10n/l10n_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface PageInfoDescription ()
@property(nonatomic, assign) web::SSLStatus status;
@property(nonatomic, assign) const GURL& URL;
@property(nonatomic, assign) BOOL isOffline;
@end
@implementation PageInfoDescription {
GURL _URL;
}
- (instancetype)initWithURL:(const GURL&)URL
SSLStatus:(const web::SSLStatus&)status
isPageOffline:(BOOL)isOffline {
self = [super init];
if (self) {
_URL = URL;
_status = status;
_isOffline = isOffline;
}
return self;
}
- (NSString*)pageSecurityStatusDescription {
if (self.isOffline) {
return l10n_util::GetNSString(IDS_IOS_PAGE_INFO_OFFLINE_PAGE);
}
if (self.URL.SchemeIs(kChromeUIScheme)) {
return l10n_util::GetNSString(IDS_PAGE_INFO_INTERNAL_PAGE);
}
if (!self.status.certificate) {
return l10n_util::GetNSString(IDS_PAGE_INFO_NOT_SECURE_SUMMARY);
}
if (net::IsCertStatusError((self.status.cert_status)) ||
(self.status.security_style ==
web::SECURITY_STYLE_AUTHENTICATION_BROKEN)) {
// HTTPS with major errors
return l10n_util::GetNSString(IDS_PAGE_INFO_NOT_SECURE_SUMMARY);
}
if (self.status.content_status ==
web::SSLStatus::DISPLAYED_INSECURE_CONTENT) {
return l10n_util::GetNSString(IDS_PAGE_INFO_NOT_SECURE_SUMMARY);
}
// Valid HTTPS
return l10n_util::GetNSString(IDS_PAGE_INFO_SECURE_SUMMARY);
}
- (NSString*)pageSecurityStatusIconImageName {
if (self.isOffline)
return @"page_info_offline";
if (!self.status.certificate) {
if (security_state::ShouldShowDangerTriangleForWarningLevel())
return @"page_info_bad";
return @"page_info_info";
}
if (net::IsCertStatusError(self.status.cert_status) ||
self.status.security_style == web::SECURITY_STYLE_AUTHENTICATION_BROKEN)
// HTTPS with major errors
return @"page_info_bad";
// The remaining states are valid HTTPS, or HTTPS with minor errors.
if (self.status.content_status ==
web::SSLStatus::DISPLAYED_INSECURE_CONTENT) {
if (security_state::ShouldShowDangerTriangleForWarningLevel())
return @"page_info_bad";
return @"page_info";
}
// Valid HTTPS
return @"page_info_good";
}
#pragma mark - Properties
- (const GURL&)URL {
return _URL;
}
@end
// Copyright 2020 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_PAGE_INFO_PAGE_INFO_MEDIATOR_H_
#define IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_MEDIATOR_H_
#import <Foundation/Foundation.h>
#include "ios/chrome/browser/main/browser.h"
#import "ios/web/public/web_state_observer_bridge.h"
@protocol PageInfoConsumer;
// The mediator is pushing the data for the root of the info page page to the
// consumer.
@interface PageInfoMediator : NSObject
- (instancetype)initWithWebState:(web::WebState*)webState
NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
// The consumer for this mediator.
@property(nonatomic, weak) id<PageInfoConsumer> consumer;
@end
#endif // IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_MEDIATOR_H_
// Copyright 2020 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/page_info/page_info_mediator.h"
#include "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/reading_list/offline_page_tab_helper.h"
#import "ios/chrome/browser/ui/page_info/page_info_consumer.h"
#import "ios/chrome/browser/ui/page_info/page_info_description.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#include "ios/web/public/navigation/navigation_item.h"
#include "ios/web/public/navigation/navigation_manager.h"
#import "ios/web/public/web_state.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface PageInfoMediator ()
@property(nonatomic, assign) web::WebState* webState;
@property(nonatomic, assign) web::NavigationItem* navigationItem;
@end
@implementation PageInfoMediator
- (instancetype)initWithWebState:(web::WebState*)webState {
self = [super init];
if (self) {
_webState = webState;
_navigationItem = _webState->GetNavigationManager()->GetVisibleItem();
}
return self;
}
- (void)setConsumer:(id<PageInfoConsumer>)consumer {
if (_consumer == consumer)
return;
_consumer = consumer;
[self updateConsumer];
}
#pragma mark - Private
- (void)updateConsumer {
const BOOL presentingOfflinePage =
OfflinePageTabHelper::FromWebState(_webState)->presenting_offline_page();
PageInfoDescription* description =
[[PageInfoDescription alloc] initWithURL:self.navigationItem->GetURL()
SSLStatus:self.navigationItem->GetSSL()
isPageOffline:presentingOfflinePage];
[self.consumer pageInfoChanged:description];
}
@end
...@@ -7,8 +7,10 @@ ...@@ -7,8 +7,10 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import "ios/chrome/browser/ui/page_info/page_info_consumer.h"
// View Controller for displaying the page info. // View Controller for displaying the page info.
@interface PageInfoViewController : UIViewController @interface PageInfoViewController : UIViewController <PageInfoConsumer>
@end @end
......
...@@ -10,4 +10,12 @@ ...@@ -10,4 +10,12 @@
@implementation PageInfoViewController @implementation PageInfoViewController
#pragma mark - PageInfoConsumer
- (void)pageInfoChanged:(PageInfoDescription*)pageInfoDescription {
// Show new page info in the UI.
// TODO(crbug.com/1038919): Implement this.
self.view.backgroundColor = [UIColor redColor];
}
@end @end
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