Index: ios/web/web_state/ui/crw_wk_web_view_web_controller.mm |
diff --git a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm |
index 54effb602f3920e2bca3b44cff0bf8af576017c7..1c1003b1a81078f54714e01d8bebb5514bfc8526 100644 |
--- a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm |
+++ b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm |
@@ -14,7 +14,9 @@ |
#include "base/values.h" |
#import "ios/web/crw_network_activity_indicator_manager.h" |
#import "ios/web/navigation/crw_session_controller.h" |
+#include "ios/web/navigation/web_load_params.h" |
#include "ios/web/public/web_client.h" |
+#import "ios/web/public/web_state/crw_native_content_provider.h" |
#import "ios/web/public/web_state/js/crw_js_injection_manager.h" |
#import "ios/web/ui_web_view_util.h" |
#include "ios/web/web_state/blocked_popup_info.h" |
@@ -26,6 +28,7 @@ |
#import "ios/web/web_state/ui/wk_web_view_configuration_provider.h" |
#import "ios/web/web_state/web_state_impl.h" |
#import "ios/web/web_state/web_view_creation_utils.h" |
+#import "ios/web/webui/crw_web_ui_manager.h" |
#import "net/base/mac/url_conversions.h" |
#if !defined(ENABLE_CHROME_NET_STACK_FOR_WKWEBVIEW) |
@@ -89,6 +92,9 @@ NSString* const kScriptImmediateName = @"crwebinvokeimmediate"; |
// Set to YES on window.history.willChangeState message. To NO on |
// window.history.didPushState or window.history.didReplaceState. |
BOOL _changingHistoryState; |
+ |
+ // CRWWebUIManager object for loading WebUI pages. |
+ base::scoped_nsobject<CRWWebUIManager> web_ui_manager_; |
} |
// Response's MIME type of the last known navigation. |
@@ -341,7 +347,7 @@ NSString* const kScriptImmediateName = @"crwebinvokeimmediate"; |
return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; |
} |
-- (void)loadWebRequest:(NSURLRequest*)request { |
+- (void)loadRequest:(NSMutableURLRequest*)request { |
[_wkWebView loadRequest:request]; |
} |
@@ -793,6 +799,20 @@ NSString* const kScriptImmediateName = @"crwebinvokeimmediate"; |
} |
#pragma mark - |
+#pragma mark WebUI |
+ |
+- (void)createWebUIForURL:(const GURL&)URL { |
+ [super createWebUIForURL:URL]; |
+ web_ui_manager_.reset( |
+ [[CRWWebUIManager alloc] initWithWebState:self.webStateImpl]); |
+} |
+ |
+- (void)clearWebUI { |
+ [super clearWebUI]; |
+ web_ui_manager_.reset(); |
+} |
+ |
+#pragma mark - |
#pragma mark KVO Observation |
- (void)observeValueForKeyPath:(NSString*)keyPath |
@@ -939,9 +959,22 @@ NSString* const kScriptImmediateName = @"crwebinvokeimmediate"; |
// If this navigation has not yet been registered, do so. loadPhase check is |
// necessary because lastRegisteredRequestURL may be the same as the |
// webViewURL on a new tab created by window.open (default is about::blank). |
+ // TODO(jyquinn): Audit [CRWWebController loadCurrentURL] for other tasks that |
+ // should be performed here. |
if (self.lastRegisteredRequestURL != webViewURL || |
self.loadPhase != web::LOAD_REQUESTED) { |
- [self registerLoadRequest:webViewURL]; |
+ // Reset current WebUI if one exists. |
+ [self clearWebUI]; |
+ // If webViewURL is a chrome URL, abort the current load and initialize the |
+ // load from the web controller. |
+ if (web::GetWebClient()->IsAppSpecificURL(webViewURL)) { |
+ [self abortWebLoad]; |
+ web::WebLoadParams params(webViewURL); |
+ [self loadWithParams:params]; |
+ return; |
+ } else { |
+ [self registerLoadRequest:webViewURL]; |
+ } |
} |
// Ensure the URL is registered and loadPhase is as expected. |
DCHECK(self.lastRegisteredRequestURL == webViewURL); |