Index: ios/chrome/browser/web/error_page_content.mm |
diff --git a/ios/chrome/browser/web/error_page_content.mm b/ios/chrome/browser/web/error_page_content.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fbd846d316c1c82a740d820beddd0463048d2cf7 |
--- /dev/null |
+++ b/ios/chrome/browser/web/error_page_content.mm |
@@ -0,0 +1,91 @@ |
+// 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/web/error_page_content.h" |
+ |
+#include <memory> |
+ |
+#import "base/ios/ns_error_util.h" |
+#include "base/strings/sys_string_conversions.h" |
+#include "base/values.h" |
+#include "components/error_page/common/error_page_params.h" |
+#include "components/error_page/common/localized_error.h" |
+#include "components/grit/components_resources.h" |
+#include "ios/chrome/browser/application_context.h" |
+#include "ios/web/public/referrer.h" |
+#include "ui/base/l10n/l10n_util.h" |
+#include "ui/base/page_transition_types.h" |
+#include "ui/base/resource/resource_bundle.h" |
+#include "ui/base/webui/jstemplate_builder.h" |
+#include "url/gurl.h" |
+ |
+@implementation ErrorPageContent |
+ |
+#pragma mark - |
+#pragma mark CRWNativeContent methods |
+ |
+// Override StaticHtmlNativeContent method to always force error pages to |
+// try loading the URL again, because the error might have been fixed. |
+- (void)reload { |
+ // Because we don't have the original page transition at this point, just |
+ // use PAGE_TRANSITION_TYPED. We can revisit if this causes problems. |
+ [super loadURL:[self url] |
+ referrer:web::Referrer() |
+ transition:ui::PAGE_TRANSITION_TYPED |
+ rendererInitiated:YES]; |
+} |
+ |
+- (void)generateHtml:(HtmlCallback)callback { |
+ callback(html_.get()); |
+} |
+ |
+- (id)initWithLoader:(id<UrlLoader>)loader |
+ browserState:(web::BrowserState*)browserState |
+ url:(const GURL&)url |
+ error:(NSError*)error |
+ isPost:(BOOL)isPost |
+ isIncognito:(BOOL)isIncognito { |
+ NSString* badURLString = |
+ [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]; |
+ NSError* originalError = base::ios::GetFinalUnderlyingErrorFromError(error); |
+ NSString* errorDomain = nil; |
+ int errorCode = 0; |
+ |
+ if (originalError) { |
+ errorDomain = [originalError domain]; |
+ errorCode = [originalError code]; |
+ } else { |
+ errorDomain = [error domain]; |
+ errorCode = [error code]; |
+ } |
+ DCHECK(errorCode != 0); |
+ |
+ base::DictionaryValue errorStrings; |
+ error_page::LocalizedError::GetStrings( |
+ errorCode, base::SysNSStringToUTF8(errorDomain), |
+ GURL(base::SysNSStringToUTF16(badURLString)), isPost, false, false, |
+ isIncognito, GetApplicationContext()->GetApplicationLocale(), nullptr, |
+ &errorStrings); |
+ |
+ ui::ScaleFactor scaleFactor = |
+ ResourceBundle::GetSharedInstance().GetMaxScaleFactor(); |
+ |
+ const base::StringPiece templateHTML( |
+ ResourceBundle::GetSharedInstance().GetRawDataResourceForScale( |
+ IDR_NET_ERROR_HTML, scaleFactor)); |
+ if (templateHTML.empty()) |
+ NOTREACHED() << "unable to load template. ID: " << IDR_NET_ERROR_HTML; |
+ std::string errorHTML = webui::GetTemplatesHtml( |
+ templateHTML, &errorStrings, "t" /* IDR_NET_ERROR_HTML root id */); |
+ html_.reset([base::SysUTF8ToNSString(errorHTML) retain]); |
+ |
+ base::scoped_nsobject<StaticHtmlViewController> HTMLViewController( |
+ [[StaticHtmlViewController alloc] initWithGenerator:self |
+ browserState:browserState]); |
+ return [super initWithLoader:loader |
+ staticHTMLViewController:HTMLViewController |
+ URL:url]; |
+} |
+ |
+@end |