OLD | NEW |
---|---|
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ios/web/web_state/ui/crw_web_controller.h" | 5 #import "ios/web/web_state/ui/crw_web_controller.h" |
6 | 6 |
7 #import <WebKit/WebKit.h> | 7 #import <WebKit/WebKit.h> |
8 | 8 |
9 #import <objc/runtime.h> | 9 #import <objc/runtime.h> |
10 #include <stddef.h> | 10 #include <stddef.h> |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
75 #import "ios/web/public/web_state/ui/crw_web_view_content_view.h" | 75 #import "ios/web/public/web_state/ui/crw_web_view_content_view.h" |
76 #import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h" | 76 #import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h" |
77 #include "ios/web/public/web_state/url_verification_constants.h" | 77 #include "ios/web/public/web_state/url_verification_constants.h" |
78 #import "ios/web/public/web_state/web_state.h" | 78 #import "ios/web/public/web_state/web_state.h" |
79 #include "ios/web/public/webui/web_ui_ios.h" | 79 #include "ios/web/public/webui/web_ui_ios.h" |
80 #import "ios/web/web_state/crw_pass_kit_downloader.h" | 80 #import "ios/web/web_state/crw_pass_kit_downloader.h" |
81 #import "ios/web/web_state/error_translation_util.h" | 81 #import "ios/web/web_state/error_translation_util.h" |
82 #import "ios/web/web_state/js/crw_js_plugin_placeholder_manager.h" | 82 #import "ios/web/web_state/js/crw_js_plugin_placeholder_manager.h" |
83 #import "ios/web/web_state/js/crw_js_post_request_loader.h" | 83 #import "ios/web/web_state/js/crw_js_post_request_loader.h" |
84 #import "ios/web/web_state/js/crw_js_window_id_manager.h" | 84 #import "ios/web/web_state/js/crw_js_window_id_manager.h" |
85 #include "ios/web/web_state/navigation_context_impl.h" | |
85 #import "ios/web/web_state/page_viewport_state.h" | 86 #import "ios/web/web_state/page_viewport_state.h" |
86 #import "ios/web/web_state/ui/crw_context_menu_controller.h" | 87 #import "ios/web/web_state/ui/crw_context_menu_controller.h" |
87 #import "ios/web/web_state/ui/crw_swipe_recognizer_provider.h" | 88 #import "ios/web/web_state/ui/crw_swipe_recognizer_provider.h" |
88 #import "ios/web/web_state/ui/crw_web_controller.h" | 89 #import "ios/web/web_state/ui/crw_web_controller.h" |
89 #import "ios/web/web_state/ui/crw_web_controller_container_view.h" | 90 #import "ios/web/web_state/ui/crw_web_controller_container_view.h" |
90 #import "ios/web/web_state/ui/crw_web_view_proxy_impl.h" | 91 #import "ios/web/web_state/ui/crw_web_view_proxy_impl.h" |
91 #import "ios/web/web_state/ui/crw_wk_navigation_states.h" | 92 #import "ios/web/web_state/ui/crw_wk_navigation_states.h" |
92 #import "ios/web/web_state/ui/crw_wk_script_message_router.h" | 93 #import "ios/web/web_state/ui/crw_wk_script_message_router.h" |
93 #import "ios/web/web_state/ui/wk_back_forward_list_item_holder.h" | 94 #import "ios/web/web_state/ui/wk_back_forward_list_item_holder.h" |
94 #import "ios/web/web_state/ui/wk_web_view_configuration_provider.h" | 95 #import "ios/web/web_state/ui/wk_web_view_configuration_provider.h" |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
558 - (web::WKWebViewConfigurationProvider&)webViewConfigurationProvider; | 559 - (web::WKWebViewConfigurationProvider&)webViewConfigurationProvider; |
559 // Extracts "Referer" [sic] value from WKNavigationAction request header. | 560 // Extracts "Referer" [sic] value from WKNavigationAction request header. |
560 - (NSString*)referrerFromNavigationAction:(WKNavigationAction*)action; | 561 - (NSString*)referrerFromNavigationAction:(WKNavigationAction*)action; |
561 | 562 |
562 // Returns the current URL of the web view, and sets |trustLevel| accordingly | 563 // Returns the current URL of the web view, and sets |trustLevel| accordingly |
563 // based on the confidence in the verification. | 564 // based on the confidence in the verification. |
564 - (GURL)webURLWithTrustLevel:(web::URLVerificationTrustLevel*)trustLevel; | 565 - (GURL)webURLWithTrustLevel:(web::URLVerificationTrustLevel*)trustLevel; |
565 // Returns |YES| if |url| should be loaded in a native view. | 566 // Returns |YES| if |url| should be loaded in a native view. |
566 - (BOOL)shouldLoadURLInNativeView:(const GURL&)url; | 567 - (BOOL)shouldLoadURLInNativeView:(const GURL&)url; |
567 // Loads the request into the |webView|. | 568 // Loads the request into the |webView|. |
568 - (void)loadRequest:(NSMutableURLRequest*)request; | 569 - (WKNavigation*)loadRequest:(NSMutableURLRequest*)request; |
569 // Loads POST request with body in |_wkWebView| by constructing an HTML page | 570 // Loads POST request with body in |_wkWebView| by constructing an HTML page |
570 // that executes the request through JavaScript and replaces document with the | 571 // that executes the request through JavaScript and replaces document with the |
571 // result. | 572 // result. |
572 // Note that this approach includes multiple body encodings and decodings, plus | 573 // Note that this approach includes multiple body encodings and decodings, plus |
573 // the data is passed to |_wkWebView| on main thread. | 574 // the data is passed to |_wkWebView| on main thread. |
574 // This is necessary because WKWebView ignores POST request body. | 575 // This is necessary because WKWebView ignores POST request body. |
575 // Workaround for https://bugs.webkit.org/show_bug.cgi?id=145410 | 576 // Workaround for https://bugs.webkit.org/show_bug.cgi?id=145410 |
576 - (void)loadPOSTRequest:(NSMutableURLRequest*)request; | 577 - (WKNavigation*)loadPOSTRequest:(NSMutableURLRequest*)request; |
577 // Loads the HTML into the page at the given URL. | 578 // Loads the HTML into the page at the given URL. |
578 - (void)loadHTML:(NSString*)html forURL:(const GURL&)url; | 579 - (void)loadHTML:(NSString*)html forURL:(const GURL&)url; |
579 | 580 |
580 // Extracts navigation info from WKNavigationAction and sets it as a pending. | 581 // Extracts navigation info from WKNavigationAction and sets it as a pending. |
581 // Some pieces of navigation information are only known in | 582 // Some pieces of navigation information are only known in |
582 // |decidePolicyForNavigationAction|, but must be in a pending state until | 583 // |decidePolicyForNavigationAction|, but must be in a pending state until |
583 // |didgo/Navigation| where it becames current. | 584 // |didgo/Navigation| where it becames current. |
584 - (void)updatePendingNavigationInfoFromNavigationAction: | 585 - (void)updatePendingNavigationInfoFromNavigationAction: |
585 (WKNavigationAction*)action; | 586 (WKNavigationAction*)action; |
586 // Extracts navigation info from WKNavigationResponse and sets it as a pending. | 587 // Extracts navigation info from WKNavigationResponse and sets it as a pending. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
639 userIsInteracting:(BOOL)userIsInteracting | 640 userIsInteracting:(BOOL)userIsInteracting |
640 originURL:(const GURL&)originURL; | 641 originURL:(const GURL&)originURL; |
641 // Called when web controller receives a new message from the web page. | 642 // Called when web controller receives a new message from the web page. |
642 - (void)didReceiveScriptMessage:(WKScriptMessage*)message; | 643 - (void)didReceiveScriptMessage:(WKScriptMessage*)message; |
643 // Returns a new script which wraps |script| with windowID check so |script| is | 644 // Returns a new script which wraps |script| with windowID check so |script| is |
644 // not evaluated on windowID mismatch. | 645 // not evaluated on windowID mismatch. |
645 - (NSString*)scriptByAddingWindowIDCheckForScript:(NSString*)script; | 646 - (NSString*)scriptByAddingWindowIDCheckForScript:(NSString*)script; |
646 // Attempts to handle a script message. Returns YES on success, NO otherwise. | 647 // Attempts to handle a script message. Returns YES on success, NO otherwise. |
647 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage; | 648 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage; |
648 // Registers load request with empty referrer and link or client redirect | 649 // Registers load request with empty referrer and link or client redirect |
649 // transition based on user interaction state. | 650 // transition based on user interaction state. Returns navigation context for |
650 - (void)registerLoadRequest:(const GURL&)URL; | 651 // this request. |
652 - (std::unique_ptr<web::NavigationContextImpl>)registerLoadRequestForURL: | |
653 (const GURL&)URL; | |
651 // Prepares web controller and delegates for anticipated page change. | 654 // Prepares web controller and delegates for anticipated page change. |
652 // Allows several methods to invoke webWill/DidAddPendingURL on anticipated page | 655 // Allows several methods to invoke webWill/DidAddPendingURL on anticipated page |
653 // change, using the same cached request and calculated transition types. | 656 // change, using the same cached request and calculated transition types. |
654 - (void)registerLoadRequest:(const GURL&)URL | 657 // Returns navigation context for this request. |
655 referrer:(const web::Referrer&)referrer | 658 - (std::unique_ptr<web::NavigationContextImpl>) |
656 transition:(ui::PageTransition)transition; | 659 registerLoadRequestForURL:(const GURL&)URL |
660 referrer:(const web::Referrer&)referrer | |
661 transition:(ui::PageTransition)transition; | |
657 // Updates the HTML5 history state of the page using the current NavigationItem. | 662 // Updates the HTML5 history state of the page using the current NavigationItem. |
658 // For same-document navigations and navigations affected by | 663 // For same-document navigations and navigations affected by |
659 // window.history.[push/replace]State(), the URL and serialized state object | 664 // window.history.[push/replace]State(), the URL and serialized state object |
660 // will be updated to the current NavigationItem's values. A popState event | 665 // will be updated to the current NavigationItem's values. A popState event |
661 // will be triggered for all same-document navigations. Additionaly, a | 666 // will be triggered for all same-document navigations. Additionaly, a |
662 // hashchange event will be triggered for same-document navigations where the | 667 // hashchange event will be triggered for same-document navigations where the |
663 // only difference between the current and previous URL is the fragment. | 668 // only difference between the current and previous URL is the fragment. |
664 - (void)updateHTML5HistoryState; | 669 - (void)updateHTML5HistoryState; |
665 // Generates the JavaScript string used to update the UIWebView's URL so that it | 670 // Generates the JavaScript string used to update the UIWebView's URL so that it |
666 // matches the URL displayed in the omnibox and sets window.history.state to | 671 // matches the URL displayed in the omnibox and sets window.history.state to |
(...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1438 | 1443 |
1439 - (UIView*)viewForPrinting { | 1444 - (UIView*)viewForPrinting { |
1440 // Printing is not supported for native controllers. | 1445 // Printing is not supported for native controllers. |
1441 return _webView; | 1446 return _webView; |
1442 } | 1447 } |
1443 | 1448 |
1444 - (double)loadingProgress { | 1449 - (double)loadingProgress { |
1445 return [_webView estimatedProgress]; | 1450 return [_webView estimatedProgress]; |
1446 } | 1451 } |
1447 | 1452 |
1448 - (void)registerLoadRequest:(const GURL&)URL { | 1453 - (std::unique_ptr<web::NavigationContextImpl>)registerLoadRequestForURL: |
1454 (const GURL&)URL { | |
1449 // Get the navigation type from the last main frame load request, and try to | 1455 // Get the navigation type from the last main frame load request, and try to |
1450 // map that to a PageTransition. | 1456 // map that to a PageTransition. |
1451 WKNavigationType navigationType = | 1457 WKNavigationType navigationType = |
1452 _pendingNavigationInfo ? [_pendingNavigationInfo navigationType] | 1458 _pendingNavigationInfo ? [_pendingNavigationInfo navigationType] |
1453 : WKNavigationTypeOther; | 1459 : WKNavigationTypeOther; |
1454 ui::PageTransition transition = ui::PAGE_TRANSITION_CLIENT_REDIRECT; | 1460 ui::PageTransition transition = ui::PAGE_TRANSITION_CLIENT_REDIRECT; |
1455 switch (navigationType) { | 1461 switch (navigationType) { |
1456 case WKNavigationTypeLinkActivated: | 1462 case WKNavigationTypeLinkActivated: |
1457 transition = ui::PAGE_TRANSITION_LINK; | 1463 transition = ui::PAGE_TRANSITION_LINK; |
1458 break; | 1464 break; |
(...skipping 12 matching lines...) Expand all Loading... | |
1471 // or may not be the result of user actions. For now, guess based on | 1477 // or may not be the result of user actions. For now, guess based on |
1472 // whether there's been an interaction since the last URL change. | 1478 // whether there's been an interaction since the last URL change. |
1473 // TODO(crbug.com/549301): See if this heuristic can be improved. | 1479 // TODO(crbug.com/549301): See if this heuristic can be improved. |
1474 transition = _interactionRegisteredSinceLastURLChange | 1480 transition = _interactionRegisteredSinceLastURLChange |
1475 ? ui::PAGE_TRANSITION_LINK | 1481 ? ui::PAGE_TRANSITION_LINK |
1476 : ui::PAGE_TRANSITION_CLIENT_REDIRECT; | 1482 : ui::PAGE_TRANSITION_CLIENT_REDIRECT; |
1477 break; | 1483 break; |
1478 } | 1484 } |
1479 // The referrer is not known yet, and will be updated later. | 1485 // The referrer is not known yet, and will be updated later. |
1480 const web::Referrer emptyReferrer; | 1486 const web::Referrer emptyReferrer; |
1481 [self registerLoadRequest:URL referrer:emptyReferrer transition:transition]; | 1487 return [self registerLoadRequestForURL:URL |
1488 referrer:emptyReferrer | |
1489 transition:transition]; | |
1482 } | 1490 } |
1483 | 1491 |
1484 - (void)registerLoadRequest:(const GURL&)requestURL | 1492 - (std::unique_ptr<web::NavigationContextImpl>) |
1485 referrer:(const web::Referrer&)referrer | 1493 registerLoadRequestForURL:(const GURL&)requestURL |
1486 transition:(ui::PageTransition)transition { | 1494 referrer:(const web::Referrer&)referrer |
1495 transition:(ui::PageTransition)transition { | |
1487 // Transfer time is registered so that further transitions within the time | 1496 // Transfer time is registered so that further transitions within the time |
1488 // envelope are not also registered as links. | 1497 // envelope are not also registered as links. |
1489 _lastTransferTimeInSeconds = CFAbsoluteTimeGetCurrent(); | 1498 _lastTransferTimeInSeconds = CFAbsoluteTimeGetCurrent(); |
1490 bool redirect = transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK; | 1499 bool redirect = transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK; |
1491 if (!redirect) { | 1500 if (!redirect) { |
1492 // Before changing phases, the delegate should be informed that any existing | 1501 // Before changing phases, the delegate should be informed that any existing |
1493 // request is being cancelled before completion. | 1502 // request is being cancelled before completion. |
1494 [self loadCancelled]; | 1503 [self loadCancelled]; |
1495 DCHECK(_loadPhase == web::PAGE_LOADED); | 1504 DCHECK(_loadPhase == web::PAGE_LOADED); |
1496 } | 1505 } |
(...skipping 12 matching lines...) Expand all Loading... | |
1509 // Update the existing pending entry. | 1518 // Update the existing pending entry. |
1510 // Typically on PAGE_TRANSITION_CLIENT_REDIRECT. | 1519 // Typically on PAGE_TRANSITION_CLIENT_REDIRECT. |
1511 [[self sessionController] updatePendingItem:requestURL]; | 1520 [[self sessionController] updatePendingItem:requestURL]; |
1512 } else { | 1521 } else { |
1513 // A new session history entry needs to be created. | 1522 // A new session history entry needs to be created. |
1514 self.navigationManagerImpl->AddPendingItem( | 1523 self.navigationManagerImpl->AddPendingItem( |
1515 requestURL, referrer, transition, | 1524 requestURL, referrer, transition, |
1516 web::NavigationInitiationType::RENDERER_INITIATED, | 1525 web::NavigationInitiationType::RENDERER_INITIATED, |
1517 web::NavigationManager::UserAgentOverrideOption::INHERIT); | 1526 web::NavigationManager::UserAgentOverrideOption::INHERIT); |
1518 } | 1527 } |
1528 std::unique_ptr<web::NavigationContextImpl> context = | |
1529 web::NavigationContextImpl::CreateNavigationContext( | |
1530 _webStateImpl, requestURL, nullptr /* response_headers */); | |
1519 _webStateImpl->SetIsLoading(true); | 1531 _webStateImpl->SetIsLoading(true); |
1532 // TODO(crbug.com/713836): pass context to |OnProvisionalNavigationStarted|. | |
1520 _webStateImpl->OnProvisionalNavigationStarted(requestURL); | 1533 _webStateImpl->OnProvisionalNavigationStarted(requestURL); |
1534 return context; | |
1521 } | 1535 } |
1522 | 1536 |
1523 - (void)updateHTML5HistoryState { | 1537 - (void)updateHTML5HistoryState { |
1524 web::NavigationItemImpl* currentItem = self.currentNavItem; | 1538 web::NavigationItemImpl* currentItem = self.currentNavItem; |
1525 if (!currentItem) | 1539 if (!currentItem) |
1526 return; | 1540 return; |
1527 | 1541 |
1528 // Same-document navigations must trigger a popState event. | 1542 // Same-document navigations must trigger a popState event. |
1529 CRWSessionController* sessionController = self.sessionController; | 1543 CRWSessionController* sessionController = self.sessionController; |
1530 BOOL sameDocumentNavigation = [sessionController | 1544 BOOL sameDocumentNavigation = [sessionController |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1805 const web::Referrer referrer; | 1819 const web::Referrer referrer; |
1806 id<CRWNativeContent> nativeContent = | 1820 id<CRWNativeContent> nativeContent = |
1807 [_nativeProvider controllerForURL:targetURL webState:self.webState]; | 1821 [_nativeProvider controllerForURL:targetURL webState:self.webState]; |
1808 // Unlike the WebView case, always create a new controller and view. | 1822 // Unlike the WebView case, always create a new controller and view. |
1809 // TODO(pinkerton): What to do if this does return nil? | 1823 // TODO(pinkerton): What to do if this does return nil? |
1810 [self setNativeController:nativeContent]; | 1824 [self setNativeController:nativeContent]; |
1811 if ([nativeContent respondsToSelector:@selector(virtualURL)]) { | 1825 if ([nativeContent respondsToSelector:@selector(virtualURL)]) { |
1812 item->SetVirtualURL([nativeContent virtualURL]); | 1826 item->SetVirtualURL([nativeContent virtualURL]); |
1813 } | 1827 } |
1814 | 1828 |
1815 [self registerLoadRequest:targetURL | 1829 std::unique_ptr<web::NavigationContextImpl> navigationContext = |
1816 referrer:referrer | 1830 [self registerLoadRequestForURL:targetURL |
1817 transition:self.currentTransition]; | 1831 referrer:referrer |
1832 transition:self.currentTransition]; | |
kkhorimoto
2017/04/25 13:45:50
I'm assuming that this will be utilized in a later
Eugene But (OOO till 7-30)
2017/04/27 16:12:06
Yes, here:
https://codereview.chromium.org/284244
| |
1818 [self loadNativeViewWithSuccess:YES]; | 1833 [self loadNativeViewWithSuccess:YES]; |
1819 } | 1834 } |
1820 | 1835 |
1821 - (void)loadWithParams:(const NavigationManager::WebLoadParams&)params { | 1836 - (void)loadWithParams:(const NavigationManager::WebLoadParams&)params { |
1822 DCHECK(!(params.transition_type & ui::PAGE_TRANSITION_FORWARD_BACK)); | 1837 DCHECK(!(params.transition_type & ui::PAGE_TRANSITION_FORWARD_BACK)); |
1823 | 1838 |
1824 // Clear transient view before making any changes to history and navigation | 1839 // Clear transient view before making any changes to history and navigation |
1825 // manager. TODO(stuartmorgan): Drive Transient Item clearing from | 1840 // manager. TODO(stuartmorgan): Drive Transient Item clearing from |
1826 // navigation system, rather than from WebController. | 1841 // navigation system, rather than from WebController. |
1827 [self clearTransientContentView]; | 1842 [self clearTransientContentView]; |
(...skipping 2320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4148 _webProcessIsDead = YES; | 4163 _webProcessIsDead = YES; |
4149 _webStateImpl->CancelDialogs(); | 4164 _webStateImpl->CancelDialogs(); |
4150 _webStateImpl->OnRenderProcessGone(); | 4165 _webStateImpl->OnRenderProcessGone(); |
4151 } | 4166 } |
4152 | 4167 |
4153 - (web::WKWebViewConfigurationProvider&)webViewConfigurationProvider { | 4168 - (web::WKWebViewConfigurationProvider&)webViewConfigurationProvider { |
4154 web::BrowserState* browserState = self.webStateImpl->GetBrowserState(); | 4169 web::BrowserState* browserState = self.webStateImpl->GetBrowserState(); |
4155 return web::WKWebViewConfigurationProvider::FromBrowserState(browserState); | 4170 return web::WKWebViewConfigurationProvider::FromBrowserState(browserState); |
4156 } | 4171 } |
4157 | 4172 |
4158 - (void)loadRequest:(NSMutableURLRequest*)request { | 4173 - (WKNavigation*)loadRequest:(NSMutableURLRequest*)request { |
4174 WKNavigation* navigation = [_webView loadRequest:request]; | |
4159 [_navigationStates setState:web::WKNavigationState::REQUESTED | 4175 [_navigationStates setState:web::WKNavigationState::REQUESTED |
4160 forNavigation:[_webView loadRequest:request]]; | 4176 forNavigation:navigation]; |
4177 return navigation; | |
4161 } | 4178 } |
4162 | 4179 |
4163 - (void)loadPOSTRequest:(NSMutableURLRequest*)request { | 4180 - (WKNavigation*)loadPOSTRequest:(NSMutableURLRequest*)request { |
4164 if (!_POSTRequestLoader) { | 4181 if (!_POSTRequestLoader) { |
4165 _POSTRequestLoader.reset([[CRWJSPOSTRequestLoader alloc] init]); | 4182 _POSTRequestLoader.reset([[CRWJSPOSTRequestLoader alloc] init]); |
4166 } | 4183 } |
4167 | 4184 |
4168 CRWWKScriptMessageRouter* messageRouter = | 4185 CRWWKScriptMessageRouter* messageRouter = |
4169 [self webViewConfigurationProvider].GetScriptMessageRouter(); | 4186 [self webViewConfigurationProvider].GetScriptMessageRouter(); |
4170 | 4187 |
4171 [_POSTRequestLoader loadPOSTRequest:request | 4188 return [_POSTRequestLoader |
4172 inWebView:_webView | 4189 loadPOSTRequest:request |
4173 messageRouter:messageRouter | 4190 inWebView:_webView |
4174 completionHandler:^(NSError* loadError) { | 4191 messageRouter:messageRouter |
4175 if (loadError) | 4192 completionHandler:^(NSError* loadError) { |
4176 [self handleLoadError:loadError | 4193 if (loadError) |
4177 inMainFrame:YES | 4194 [self handleLoadError:loadError inMainFrame:YES forNavigation:nil]; |
4178 forNavigation:nil]; | 4195 else |
4179 else | 4196 self.webStateImpl->SetContentsMimeType("text/html"); |
4180 self.webStateImpl->SetContentsMimeType("text/html"); | 4197 }]; |
4181 }]; | |
4182 } | 4198 } |
4183 | 4199 |
4184 - (void)loadHTML:(NSString*)HTML forURL:(const GURL&)URL { | 4200 - (void)loadHTML:(NSString*)HTML forURL:(const GURL&)URL { |
4185 // Remove the transient content view. | 4201 // Remove the transient content view. |
4186 [self clearTransientContentView]; | 4202 [self clearTransientContentView]; |
4187 | 4203 |
4188 _loadPhase = web::LOAD_REQUESTED; | 4204 _loadPhase = web::LOAD_REQUESTED; |
4189 | 4205 |
4190 // Web View should not be created for App Specific URLs. | 4206 // Web View should not be created for App Specific URLs. |
4191 if (!web::GetWebClient()->IsAppSpecificURL(URL)) { | 4207 if (!web::GetWebClient()->IsAppSpecificURL(URL)) { |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4469 // pages. WebUI pages may have increased power and using the same web | 4485 // pages. WebUI pages may have increased power and using the same web |
4470 // process (which may potentially be controller by an attacker) is | 4486 // process (which may potentially be controller by an attacker) is |
4471 // dangerous. | 4487 // dangerous. |
4472 if (web::GetWebClient()->IsAppSpecificURL(_documentURL)) { | 4488 if (web::GetWebClient()->IsAppSpecificURL(_documentURL)) { |
4473 [self abortLoad]; | 4489 [self abortLoad]; |
4474 NavigationManager::WebLoadParams params(webViewURL); | 4490 NavigationManager::WebLoadParams params(webViewURL); |
4475 [self loadWithParams:params]; | 4491 [self loadWithParams:params]; |
4476 } | 4492 } |
4477 return; | 4493 return; |
4478 } else { | 4494 } else { |
4479 [self registerLoadRequest:webViewURL]; | 4495 std::unique_ptr<web::NavigationContextImpl> navigationContext = |
4496 [self registerLoadRequestForURL:webViewURL]; | |
4480 } | 4497 } |
4481 } | 4498 } |
4482 | 4499 |
4483 // Ensure the URL is registered and loadPhase is as expected. | 4500 // Ensure the URL is registered and loadPhase is as expected. |
4484 DCHECK(_lastRegisteredRequestURL == webViewURL); | 4501 DCHECK(_lastRegisteredRequestURL == webViewURL); |
4485 DCHECK(self.loadPhase == web::LOAD_REQUESTED); | 4502 DCHECK(self.loadPhase == web::LOAD_REQUESTED); |
4486 } | 4503 } |
4487 | 4504 |
4488 - (void)webView:(WKWebView*)webView | 4505 - (void)webView:(WKWebView*)webView |
4489 didReceiveServerRedirectForProvisionalNavigation:(WKNavigation*)navigation { | 4506 didReceiveServerRedirectForProvisionalNavigation:(WKNavigation*)navigation { |
4490 [_navigationStates setState:web::WKNavigationState::REDIRECTED | 4507 [_navigationStates setState:web::WKNavigationState::REDIRECTED |
4491 forNavigation:navigation]; | 4508 forNavigation:navigation]; |
4492 | 4509 |
4493 [self registerLoadRequest:net::GURLWithNSURL(webView.URL) | 4510 // It is fine to ignore returned NavigationContet as it did not |
kkhorimoto
2017/04/25 13:45:50
s/Contet/Context
Eugene But (OOO till 7-30)
2017/04/27 16:12:06
Done.
| |
4494 referrer:[self currentReferrer] | 4511 // change after the redirect. |
kkhorimoto
2017/04/25 13:45:50
I don't really understand this comment. It looks
Eugene But (OOO till 7-30)
2017/04/27 16:12:06
Updated the comment. Please let me know if it is s
| |
4495 transition:ui::PAGE_TRANSITION_SERVER_REDIRECT]; | 4512 [self registerLoadRequestForURL:net::GURLWithNSURL(webView.URL) |
4513 referrer:[self currentReferrer] | |
4514 transition:ui::PAGE_TRANSITION_SERVER_REDIRECT]; | |
4496 } | 4515 } |
4497 | 4516 |
4498 - (void)webView:(WKWebView*)webView | 4517 - (void)webView:(WKWebView*)webView |
4499 didFailProvisionalNavigation:(WKNavigation*)navigation | 4518 didFailProvisionalNavigation:(WKNavigation*)navigation |
4500 withError:(NSError*)error { | 4519 withError:(NSError*)error { |
4501 [_navigationStates setState:web::WKNavigationState::PROVISIONALY_FAILED | 4520 [_navigationStates setState:web::WKNavigationState::PROVISIONALY_FAILED |
4502 forNavigation:navigation]; | 4521 forNavigation:navigation]; |
4503 | 4522 |
4504 // Ignore provisional navigation failure if a new navigation has been started, | 4523 // Ignore provisional navigation failure if a new navigation has been started, |
4505 // for example, if a page is reloaded after the start of the provisional | 4524 // for example, if a page is reloaded after the start of the provisional |
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4954 // history changes when a window.history.didPushState or | 4973 // history changes when a window.history.didPushState or |
4955 // window.history.didReplaceState message is received, which should happen in | 4974 // window.history.didReplaceState message is received, which should happen in |
4956 // the next runloop. | 4975 // the next runloop. |
4957 // | 4976 // |
4958 // Otherwise, simulate the whole delegate flow for a load (since the | 4977 // Otherwise, simulate the whole delegate flow for a load (since the |
4959 // superclass currently doesn't have a clean separation between URL changes | 4978 // superclass currently doesn't have a clean separation between URL changes |
4960 // and document changes). Note that the order of these calls is important: | 4979 // and document changes). Note that the order of these calls is important: |
4961 // registering a load request logically comes before updating the document | 4980 // registering a load request logically comes before updating the document |
4962 // URL, but also must come first since it uses state that is reset on URL | 4981 // URL, but also must come first since it uses state that is reset on URL |
4963 // changes. | 4982 // changes. |
4983 std::unique_ptr<web::NavigationContextImpl> navigationContext; | |
4964 if (!_changingHistoryState) { | 4984 if (!_changingHistoryState) { |
4965 // If this wasn't a previously-expected load (e.g., certain back/forward | 4985 // If this wasn't a previously-expected load (e.g., certain back/forward |
4966 // navigations), register the load request. | 4986 // navigations), register the load request. |
4967 if (![self isLoadRequestPendingForURL:newURL]) | 4987 if (![self isLoadRequestPendingForURL:newURL]) |
4968 [self registerLoadRequest:newURL]; | 4988 navigationContext = [self registerLoadRequestForURL:newURL]; |
4969 } | 4989 } |
4970 | 4990 |
4971 [self setDocumentURL:newURL]; | 4991 [self setDocumentURL:newURL]; |
4972 | 4992 |
4973 if (!_changingHistoryState) { | 4993 if (!_changingHistoryState) { |
4974 [self didStartLoadingURL:_documentURL]; | 4994 [self didStartLoadingURL:_documentURL]; |
4975 _webStateImpl->OnSameDocumentNavigation(newURL); | 4995 _webStateImpl->OnSameDocumentNavigation(newURL); |
4976 [self updateSSLStatusForCurrentNavigationItem]; | 4996 [self updateSSLStatusForCurrentNavigationItem]; |
4977 [self didFinishNavigation:nil]; | 4997 [self didFinishNavigation:nil]; |
4978 } | 4998 } |
(...skipping 29 matching lines...) Expand all Loading... | |
5008 NSMutableURLRequest* request = [self requestForCurrentNavigationItem]; | 5028 NSMutableURLRequest* request = [self requestForCurrentNavigationItem]; |
5009 | 5029 |
5010 // If the request has POST data and is not a repost form, configure and | 5030 // If the request has POST data and is not a repost form, configure and |
5011 // run the POST request. | 5031 // run the POST request. |
5012 if (POSTData.length && !repostedForm) { | 5032 if (POSTData.length && !repostedForm) { |
5013 [request setHTTPMethod:@"POST"]; | 5033 [request setHTTPMethod:@"POST"]; |
5014 [request setHTTPBody:POSTData]; | 5034 [request setHTTPBody:POSTData]; |
5015 [request setAllHTTPHeaderFields:self.currentHTTPHeaders]; | 5035 [request setAllHTTPHeaderFields:self.currentHTTPHeaders]; |
5016 GURL navigationURL = | 5036 GURL navigationURL = |
5017 currentItem ? currentItem->GetURL() : GURL::EmptyGURL(); | 5037 currentItem ? currentItem->GetURL() : GURL::EmptyGURL(); |
5018 [self registerLoadRequest:navigationURL | 5038 std::unique_ptr<web::NavigationContextImpl> navigationContext = |
5019 referrer:self.currentNavItemReferrer | 5039 [self registerLoadRequestForURL:navigationURL |
5020 transition:self.currentTransition]; | 5040 referrer:self.currentNavItemReferrer |
5041 transition:self.currentTransition]; | |
5021 [self loadPOSTRequest:request]; | 5042 [self loadPOSTRequest:request]; |
5022 return; | 5043 return; |
5023 } | 5044 } |
5024 | 5045 |
5025 ProceduralBlock defaultNavigationBlock = ^{ | 5046 ProceduralBlock defaultNavigationBlock = ^{ |
5026 web::NavigationItem* item = self.currentNavItem; | 5047 web::NavigationItem* item = self.currentNavItem; |
5027 GURL navigationURL = item ? item->GetURL() : GURL::EmptyGURL(); | 5048 GURL navigationURL = item ? item->GetURL() : GURL::EmptyGURL(); |
5028 [self registerLoadRequest:navigationURL | 5049 std::unique_ptr<web::NavigationContextImpl> navigationContext = |
5029 referrer:self.currentNavItemReferrer | 5050 [self registerLoadRequestForURL:navigationURL |
5030 transition:self.currentTransition]; | 5051 referrer:self.currentNavItemReferrer |
5052 transition:self.currentTransition]; | |
5031 [self loadRequest:request]; | 5053 [self loadRequest:request]; |
5032 [self reportBackForwardNavigationTypeForFastNavigation:NO]; | 5054 [self reportBackForwardNavigationTypeForFastNavigation:NO]; |
5033 }; | 5055 }; |
5034 | 5056 |
5035 // When navigating via WKBackForwardListItem to pages created or updated by | 5057 // When navigating via WKBackForwardListItem to pages created or updated by |
5036 // calls to pushState() and replaceState(), sometimes web_bundle.js is not | 5058 // calls to pushState() and replaceState(), sometimes web_bundle.js is not |
5037 // injected correctly. This means that calling window.history navigation | 5059 // injected correctly. This means that calling window.history navigation |
5038 // functions will invoke WKWebView's non-overridden implementations, causing a | 5060 // functions will invoke WKWebView's non-overridden implementations, causing a |
5039 // mismatch between the WKBackForwardList and NavigationManager. | 5061 // mismatch between the WKBackForwardList and NavigationManager. |
5040 // TODO(crbug.com/659816): Figure out how to prevent web_bundle.js injection | 5062 // TODO(crbug.com/659816): Figure out how to prevent web_bundle.js injection |
(...skipping 14 matching lines...) Expand all Loading... | |
5055 return; | 5077 return; |
5056 } | 5078 } |
5057 | 5079 |
5058 ProceduralBlock webViewNavigationBlock = ^{ | 5080 ProceduralBlock webViewNavigationBlock = ^{ |
5059 // If the current navigation URL is the same as the URL of the visible | 5081 // If the current navigation URL is the same as the URL of the visible |
5060 // page, that means the user requested a reload. |goToBackForwardListItem| | 5082 // page, that means the user requested a reload. |goToBackForwardListItem| |
5061 // will be a no-op when it is passed the current back forward list item, | 5083 // will be a no-op when it is passed the current back forward list item, |
5062 // so |reload| must be explicitly called. | 5084 // so |reload| must be explicitly called. |
5063 web::NavigationItem* item = self.currentNavItem; | 5085 web::NavigationItem* item = self.currentNavItem; |
5064 GURL navigationURL = item ? item->GetURL() : GURL::EmptyGURL(); | 5086 GURL navigationURL = item ? item->GetURL() : GURL::EmptyGURL(); |
5065 [self registerLoadRequest:navigationURL | 5087 std::unique_ptr<web::NavigationContextImpl> navigationContext = |
5066 referrer:self.currentNavItemReferrer | 5088 [self registerLoadRequestForURL:navigationURL |
5067 transition:self.currentTransition]; | 5089 referrer:self.currentNavItemReferrer |
5090 transition:self.currentTransition]; | |
5068 WKNavigation* navigation = nil; | 5091 WKNavigation* navigation = nil; |
5069 if (navigationURL == net::GURLWithNSURL([_webView URL])) { | 5092 if (navigationURL == net::GURLWithNSURL([_webView URL])) { |
5070 navigation = [_webView reload]; | 5093 navigation = [_webView reload]; |
5071 } else { | 5094 } else { |
5072 // |didCommitNavigation:| may not be called for fast navigation, so update | 5095 // |didCommitNavigation:| may not be called for fast navigation, so update |
5073 // the navigation type now as it is already known. | 5096 // the navigation type now as it is already known. |
5074 holder->set_navigation_type(WKNavigationTypeBackForward); | 5097 holder->set_navigation_type(WKNavigationTypeBackForward); |
5075 navigation = | 5098 navigation = |
5076 [_webView goToBackForwardListItem:holder->back_forward_list_item()]; | 5099 [_webView goToBackForwardListItem:holder->back_forward_list_item()]; |
5077 [self reportBackForwardNavigationTypeForFastNavigation:YES]; | 5100 [self reportBackForwardNavigationTypeForFastNavigation:YES]; |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5177 - (NSUInteger)observerCount { | 5200 - (NSUInteger)observerCount { |
5178 DCHECK_EQ(_observerBridges.size(), [_observers count]); | 5201 DCHECK_EQ(_observerBridges.size(), [_observers count]); |
5179 return [_observers count]; | 5202 return [_observers count]; |
5180 } | 5203 } |
5181 | 5204 |
5182 - (NSString*)referrerFromNavigationAction:(WKNavigationAction*)action { | 5205 - (NSString*)referrerFromNavigationAction:(WKNavigationAction*)action { |
5183 return [action.request valueForHTTPHeaderField:kReferrerHeaderName]; | 5206 return [action.request valueForHTTPHeaderField:kReferrerHeaderName]; |
5184 } | 5207 } |
5185 | 5208 |
5186 @end | 5209 @end |
OLD | NEW |