|  | // Copyright 2012 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_not_available_controller.h" | 
|  |  | 
|  | #include "base/i18n/rtl.h" | 
|  | #include "base/logging.h" | 
|  |  | 
|  | #include "base/strings/sys_string_conversions.h" | 
|  | #include "base/strings/utf_string_conversions.h" | 
|  | #include "components/strings/grit/components_strings.h" | 
|  | #include "components/url_formatter/url_formatter.h" | 
|  | #include "ui/base/l10n/l10n_util.h" | 
|  | #include "ui/base/l10n/l10n_util_mac.h" | 
|  |  | 
|  | #if !defined(__has_feature) || !__has_feature(objc_arc) | 
|  | #error "This file requires ARC support." | 
|  | #endif | 
|  |  | 
|  | namespace { | 
|  | // Top padding for |self.titleLabel|. | 
|  | const CGFloat kTitleLabelTopPadding = 20.0; | 
|  | // Height for |self.titleLabel|. | 
|  | const CGFloat kTitleLabelHeight = 38.0; | 
|  | // Top padding for |self.descriptionView|. | 
|  | const CGFloat kDescriptionViewTopPadding = 66.0; | 
|  | // Bottom padding for |self.descriptionView|. | 
|  | const CGFloat kDescriptionViewBottomPadding = 20.0; | 
|  | // Horizontal padding between subviews and |self.view|. | 
|  | const CGFloat kHorizontalPadding = 20.0; | 
|  | // Font size for |self.titleLabel|. | 
|  | const CGFloat kTitleLabelFontSize = 18.0; | 
|  | // Font size for |self.descriptionView|. | 
|  | const CGFloat kDescriptionViewFontSize = 17.0; | 
|  | } | 
|  |  | 
|  | @interface PageNotAvailableController () { | 
|  | } | 
|  |  | 
|  | // The title label displayed centered at the top of the screen. | 
|  | @property(nonatomic, strong) UILabel* titleLabel; | 
|  |  | 
|  | // TextView containing a detailed description of the problem. | 
|  | @property(nonatomic, strong) UITextView* descriptionView; | 
|  |  | 
|  | @end | 
|  |  | 
|  | @implementation PageNotAvailableController | 
|  |  | 
|  | @synthesize titleLabel = _titleLabel; | 
|  | @synthesize descriptionView = _descriptionView; | 
|  | @synthesize descriptionText = _descriptionText; | 
|  |  | 
|  | - (instancetype)initWithUrl:(const GURL&)url { | 
|  | self = [super initWithNibName:nil url:url]; | 
|  | if (self) { | 
|  | // Use the host as the page title, unless the URL has a custom scheme. | 
|  | if (self.url.SchemeIsHTTPOrHTTPS()) { | 
|  | self.title = base::SysUTF16ToNSString( | 
|  | url_formatter::IDNToUnicode(self.url.host())); | 
|  | } else { | 
|  | base::string16 formattedURL = url_formatter::FormatUrl( | 
|  | self.url, url_formatter::kFormatUrlOmitNothing, | 
|  | net::UnescapeRule::NORMAL, nullptr, nullptr, nullptr); | 
|  | if (base::i18n::IsRTL()) { | 
|  | base::i18n::WrapStringWithLTRFormatting(&formattedURL); | 
|  | } | 
|  | self.title = base::SysUTF16ToNSString(formattedURL); | 
|  | } | 
|  |  | 
|  | // |self.view| setup. | 
|  | CGRect windowBounds = [UIApplication sharedApplication].keyWindow.bounds; | 
|  | UIView* view = [[UIView alloc] initWithFrame:windowBounds]; | 
|  | [view setBackgroundColor:[UIColor whiteColor]]; | 
|  | [view setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | | 
|  | UIViewAutoresizingFlexibleHeight)]; | 
|  | self.view = view; | 
|  |  | 
|  | // |self.titleLabel| setup. | 
|  | CGRect titleLabelFrame = windowBounds; | 
|  | titleLabelFrame.origin.x += kHorizontalPadding; | 
|  | titleLabelFrame.size.width -= 2.0 * kHorizontalPadding; | 
|  | titleLabelFrame.origin.y += kTitleLabelTopPadding; | 
|  | titleLabelFrame.size.height = kTitleLabelHeight; | 
|  | _titleLabel = [[UILabel alloc] initWithFrame:titleLabelFrame]; | 
|  | _titleLabel.text = | 
|  | l10n_util::GetNSString(IDS_ERRORPAGES_HEADING_NOT_AVAILABLE); | 
|  | _titleLabel.autoresizingMask = (UIViewAutoresizingFlexibleBottomMargin | | 
|  | UIViewAutoresizingFlexibleWidth); | 
|  | _titleLabel.font = | 
|  | [UIFont fontWithName:@"Helvetica-Bold" size:kTitleLabelFontSize]; | 
|  | _titleLabel.textAlignment = NSTextAlignmentCenter; | 
|  | [self.view addSubview:_titleLabel]; | 
|  |  | 
|  | // |self.descriptionView| setup. | 
|  | CGRect descriptionViewFrame = windowBounds; | 
|  | descriptionViewFrame.origin.x += kHorizontalPadding; | 
|  | descriptionViewFrame.size.width -= 2 * kHorizontalPadding; | 
|  | descriptionViewFrame.origin.y = kDescriptionViewTopPadding; | 
|  | descriptionViewFrame.size.height = CGRectGetHeight(windowBounds) - | 
|  | descriptionViewFrame.origin.y - | 
|  | kDescriptionViewBottomPadding; | 
|  | _descriptionView = [[UITextView alloc] initWithFrame:descriptionViewFrame]; | 
|  | _descriptionView.text = l10n_util::GetNSStringF( | 
|  | IDS_ERRORPAGES_SUMMARY_NOT_AVAILABLE_NO_EMPHASIS, | 
|  | base::UTF8ToUTF16(self.url.spec())); | 
|  | _descriptionView.autoresizingMask = | 
|  | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; | 
|  | _descriptionView.font = [UIFont systemFontOfSize:kDescriptionViewFontSize]; | 
|  | _descriptionView.editable = NO; | 
|  | [self.view addSubview:_descriptionView]; | 
|  | } | 
|  | return self; | 
|  | } | 
|  |  | 
|  | - (instancetype)initWithNibName:(NSString*)nibName | 
|  | url:(const GURL&)url NS_UNAVAILABLE { | 
|  | NOTREACHED(); | 
|  | return nil; | 
|  | } | 
|  |  | 
|  | - (void)setDescriptionText:(NSString*)descriptionText { | 
|  | _descriptionText = [descriptionText copy]; | 
|  | _descriptionView.text = _descriptionText; | 
|  | } | 
|  |  | 
|  | @end |