Chromium Code Reviews| 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 <objc/runtime.h> | 7 #import <objc/runtime.h> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/ios/block_types.h" | 10 #include "base/ios/block_types.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 44 #include "ios/web/public/referrer.h" | 44 #include "ios/web/public/referrer.h" |
| 45 #include "ios/web/public/referrer_util.h" | 45 #include "ios/web/public/referrer_util.h" |
| 46 #include "ios/web/public/ssl_status.h" | 46 #include "ios/web/public/ssl_status.h" |
| 47 #include "ios/web/public/url_scheme_util.h" | 47 #include "ios/web/public/url_scheme_util.h" |
| 48 #include "ios/web/public/url_util.h" | 48 #include "ios/web/public/url_util.h" |
| 49 #include "ios/web/public/user_metrics.h" | 49 #include "ios/web/public/user_metrics.h" |
| 50 #include "ios/web/public/web_client.h" | 50 #include "ios/web/public/web_client.h" |
| 51 #include "ios/web/public/web_state/credential.h" | 51 #include "ios/web/public/web_state/credential.h" |
| 52 #import "ios/web/public/web_state/crw_web_controller_observer.h" | 52 #import "ios/web/public/web_state/crw_web_controller_observer.h" |
| 53 #import "ios/web/public/web_state/crw_web_view_scroll_view_proxy.h" | 53 #import "ios/web/public/web_state/crw_web_view_scroll_view_proxy.h" |
| 54 #import "ios/web/public/web_state/error_translation_util.h" | |
| 54 #import "ios/web/public/web_state/js/crw_js_injection_manager.h" | 55 #import "ios/web/public/web_state/js/crw_js_injection_manager.h" |
| 55 #import "ios/web/public/web_state/js/crw_js_injection_receiver.h" | 56 #import "ios/web/public/web_state/js/crw_js_injection_receiver.h" |
| 56 #import "ios/web/public/web_state/ui/crw_native_content.h" | 57 #import "ios/web/public/web_state/ui/crw_native_content.h" |
| 57 #import "ios/web/public/web_state/ui/crw_native_content_provider.h" | 58 #import "ios/web/public/web_state/ui/crw_native_content_provider.h" |
| 58 #include "ios/web/public/web_state/url_verification_constants.h" | 59 #include "ios/web/public/web_state/url_verification_constants.h" |
| 59 #include "ios/web/public/web_state/web_state.h" | 60 #include "ios/web/public/web_state/web_state.h" |
| 60 #include "ios/web/web_state/blocked_popup_info.h" | 61 #include "ios/web/web_state/blocked_popup_info.h" |
| 61 #import "ios/web/web_state/crw_web_view_proxy_impl.h" | 62 #import "ios/web/web_state/crw_web_view_proxy_impl.h" |
| 62 #import "ios/web/web_state/error_translation_util.h" | |
| 63 #include "ios/web/web_state/frame_info.h" | 63 #include "ios/web/web_state/frame_info.h" |
| 64 #import "ios/web/web_state/js/credential_util.h" | 64 #import "ios/web/web_state/js/credential_util.h" |
| 65 #import "ios/web/web_state/js/crw_js_early_script_manager.h" | 65 #import "ios/web/web_state/js/crw_js_early_script_manager.h" |
| 66 #import "ios/web/web_state/js/crw_js_plugin_placeholder_manager.h" | 66 #import "ios/web/web_state/js/crw_js_plugin_placeholder_manager.h" |
| 67 #import "ios/web/web_state/js/crw_js_window_id_manager.h" | 67 #import "ios/web/web_state/js/crw_js_window_id_manager.h" |
| 68 #import "ios/web/web_state/ui/crw_context_menu_provider.h" | 68 #import "ios/web/web_state/ui/crw_context_menu_provider.h" |
| 69 #import "ios/web/web_state/ui/crw_swipe_recognizer_provider.h" | 69 #import "ios/web/web_state/ui/crw_swipe_recognizer_provider.h" |
| 70 #import "ios/web/web_state/ui/crw_ui_web_view_web_controller.h" | 70 #import "ios/web/web_state/ui/crw_ui_web_view_web_controller.h" |
| 71 #import "ios/web/web_state/ui/crw_web_controller+protected.h" | 71 #import "ios/web/web_state/ui/crw_web_controller+protected.h" |
| 72 #import "ios/web/web_state/ui/crw_web_controller_container_view.h" | 72 #import "ios/web/web_state/ui/crw_web_controller_container_view.h" |
| (...skipping 1343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1416 } | 1416 } |
| 1417 } | 1417 } |
| 1418 } | 1418 } |
| 1419 | 1419 |
| 1420 - (void)loadErrorInNativeView:(NSError*)error { | 1420 - (void)loadErrorInNativeView:(NSError*)error { |
| 1421 [self removeWebViewAllowingCachedReconstruction:NO]; | 1421 [self removeWebViewAllowingCachedReconstruction:NO]; |
| 1422 | 1422 |
| 1423 const GURL currentUrl = [self currentNavigationURL]; | 1423 const GURL currentUrl = [self currentNavigationURL]; |
| 1424 BOOL isPost = [self currentPOSTData] != nil; | 1424 BOOL isPost = [self currentPOSTData] != nil; |
| 1425 | 1425 |
| 1426 error = web::NetErrorFromError(error); | |
| 1426 [self setNativeController:[_nativeProvider controllerForURL:currentUrl | 1427 [self setNativeController:[_nativeProvider controllerForURL:currentUrl |
| 1427 withError:error | 1428 withError:error |
| 1428 isPost:isPost]]; | 1429 isPost:isPost]]; |
| 1429 [self loadNativeViewWithSuccess:NO]; | 1430 [self loadNativeViewWithSuccess:NO]; |
| 1430 } | 1431 } |
| 1431 | 1432 |
| 1432 // Load the current URL in a native controller, retrieved from the native | 1433 // Load the current URL in a native controller, retrieved from the native |
| 1433 // provider. Call |loadNativeViewWithSuccess:YES| to load the native controller. | 1434 // provider. Call |loadNativeViewWithSuccess:YES| to load the native controller. |
| 1434 - (void)loadCurrentURLInNativeView { | 1435 - (void)loadCurrentURLInNativeView { |
| 1435 // Free the web view. | 1436 // Free the web view. |
| (...skipping 1377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2813 // Reset |_lastRegisteredRequestURL| so that it reflects the URL from before | 2814 // Reset |_lastRegisteredRequestURL| so that it reflects the URL from before |
| 2814 // the load was rejected. This value may be out of sync because | 2815 // the load was rejected. This value may be out of sync because |
| 2815 // |_lastRegisteredRequestURL| may have already been updated before the load | 2816 // |_lastRegisteredRequestURL| may have already been updated before the load |
| 2816 // was rejected. | 2817 // was rejected. |
| 2817 _lastRegisteredRequestURL = [self currentURL]; | 2818 _lastRegisteredRequestURL = [self currentURL]; |
| 2818 _loadPhase = web::PAGE_LOADING; | 2819 _loadPhase = web::PAGE_LOADING; |
| 2819 [self didFinishNavigation]; | 2820 [self didFinishNavigation]; |
| 2820 } | 2821 } |
| 2821 | 2822 |
| 2822 - (void)handleLoadError:(NSError*)error inMainFrame:(BOOL)inMainFrame { | 2823 - (void)handleLoadError:(NSError*)error inMainFrame:(BOOL)inMainFrame { |
| 2823 // Attempt to translate iOS errors into their corresponding net errors. | |
| 2824 error = web::NetErrorFromError(error); | |
| 2825 | |
| 2826 if ([error code] == NSURLErrorUnsupportedURL) | 2824 if ([error code] == NSURLErrorUnsupportedURL) |
| 2827 return; | 2825 return; |
| 2828 // In cases where a Plug-in handles the load do not take any further action. | 2826 // In cases where a Plug-in handles the load do not take any further action. |
| 2829 if ([[error domain] isEqual:WebKitErrorDomain] && | 2827 if ([[error domain] isEqual:WebKitErrorDomain] && |
| 2830 ([error code] == WebKitErrorPlugInLoadFailed || | 2828 ([error code] == WebKitErrorPlugInLoadFailed || |
| 2831 [error code] == WebKitErrorCannotShowURL)) | 2829 [error code] == WebKitErrorCannotShowURL)) |
| 2832 return; | 2830 return; |
| 2833 | 2831 |
| 2834 // Continue processing only if the error is on the main request or is the | 2832 // Continue processing only if the error is on the main request or is the |
| 2835 // result of a user interaction. | 2833 // result of a user interaction. |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2877 [_delegate controllerForUnhandledContentAtURL:errorGURL]; | 2875 [_delegate controllerForUnhandledContentAtURL:errorGURL]; |
| 2878 if (controller) { | 2876 if (controller) { |
| 2879 [self loadCompleteWithSuccess:NO]; | 2877 [self loadCompleteWithSuccess:NO]; |
| 2880 [self removeWebViewAllowingCachedReconstruction:NO]; | 2878 [self removeWebViewAllowingCachedReconstruction:NO]; |
| 2881 [self setNativeController:controller]; | 2879 [self setNativeController:controller]; |
| 2882 [self loadNativeViewWithSuccess:YES]; | 2880 [self loadNativeViewWithSuccess:YES]; |
| 2883 return; | 2881 return; |
| 2884 } | 2882 } |
| 2885 } | 2883 } |
| 2886 | 2884 |
| 2887 // Otherwise, handle the error normally. | 2885 // Ignore errors that originate from URLs that are opened in external apps. |
| 2888 if ([_openedApplicationURL containsObject:errorURL]) | 2886 if ([_openedApplicationURL containsObject:errorURL]) |
| 2889 return; | 2887 return; |
| 2890 // Certain frame errors don't have URL information for some reason; for | 2888 // Certain frame errors don't have URL information for some reason; for |
| 2891 // those cases (so far the only known case is plugin content loaded directly | 2889 // those cases (so far the only known case is plugin content loaded directly |
| 2892 // in a frame) just ignore the error. See crbug.com/414295 | 2890 // in a frame) just ignore the error. See crbug.com/414295 |
| 2893 if (!errorURL) { | 2891 if (!errorURL) { |
| 2894 DCHECK(!inMainFrame); | 2892 DCHECK(!inMainFrame); |
| 2895 return; | 2893 return; |
| 2896 } | 2894 } |
| 2897 // The wrapper error uses the URL of the error and not the requested URL | 2895 // The wrapper error uses the URL of the error and not the requested URL |
| 2898 // (which can be different in case of a redirect) to match desktop Chrome | 2896 // (which can be different in case of a redirect) to match desktop Chrome |
| 2899 // behavior. | 2897 // behavior. |
| 2900 NSError* wrapperError = [NSError | 2898 NSError* wrapperError = [NSError |
| 2901 errorWithDomain:[error domain] | 2899 errorWithDomain:[error domain] |
| 2902 code:[error code] | 2900 code:[error code] |
| 2903 userInfo:@{ | 2901 userInfo:@{ |
| 2904 NSURLErrorFailingURLStringErrorKey : [errorURL absoluteString], | 2902 NSURLErrorFailingURLStringErrorKey : [errorURL absoluteString], |
| 2905 NSUnderlyingErrorKey : error | 2903 NSUnderlyingErrorKey : error |
| 2906 }]; | 2904 }]; |
| 2907 [self loadCompleteWithSuccess:NO]; | 2905 [self loadCompleteWithSuccess:NO]; |
| 2908 [self loadErrorInNativeView:wrapperError]; | 2906 [self loadErrorInNativeView:wrapperError]; |
| 2909 return; | 2907 return; |
| 2910 } | 2908 } |
| 2911 | 2909 |
| 2912 // TODO(ios): Audit comments and behavior below regarding error origin. The | |
| 2913 // error has been translated and may appear to have originated in the Chrome | |
| 2914 // network stack when that is not true (crbug.com/496972) | |
| 2915 // Ignore cancelled errors. | |
| 2916 if ([error code] == NSURLErrorCancelled) { | 2910 if ([error code] == NSURLErrorCancelled) { |
| 2917 NSError* underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; | 2911 NSError* underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; |
| 2918 if (underlyingError && [self shouldAbortLoadForCancelledURL:errorGURL]) { | 2912 if (underlyingError && [self shouldAbortLoadForCancelledURL:errorGURL]) { |
| 2919 DCHECK([underlyingError isKindOfClass:[NSError class]]); | 2913 DCHECK([underlyingError isKindOfClass:[NSError class]]); |
| 2920 | 2914 |
| 2921 // The Error contains an NSUnderlyingErrorKey so it's being generated | 2915 // NSURLCancelled errors with underlying errors are generated from the |
| 2922 // in the Chrome network stack. Aborting the load in this case. | 2916 // chrome network stack. Aborting the load in this case. |
| 2923 [self abortLoad]; | 2917 [self abortLoad]; |
| 2924 | 2918 |
| 2925 switch ([underlyingError code]) { | 2919 switch ([underlyingError code]) { |
| 2926 case net::ERR_ABORTED: | 2920 case net::ERR_ABORTED: |
| 2927 // |NSURLErrorCancelled| errors with underlying net error code | 2921 // |NSURLErrorCancelled| errors with underlying net error code |
| 2928 // |net::ERR_ABORTED| are used by the Chrome network stack to | 2922 // |net::ERR_ABORTED| are used by the Chrome network stack to |
| 2929 // indicate that the current load should be aborted and the pending | 2923 // indicate that the current load should be aborted and the pending |
| 2930 // entry should be discarded. | 2924 // entry should be discarded. |
| 2931 [[self sessionController] discardNonCommittedEntries]; | 2925 [[self sessionController] discardNonCommittedEntries]; |
| 2932 break; | 2926 break; |
| 2933 case net::ERR_BLOCKED_BY_CLIENT: | 2927 case net::ERR_BLOCKED_BY_CLIENT: |
| 2934 // |NSURLErrorCancelled| errors with underlying net error code | 2928 // |NSURLErrorCancelled| errors with underlying net error code |
| 2935 // |net::ERR_BLOCKED_BY_CLIENT| are used by the Chrome network stack | 2929 // |net::ERR_BLOCKED_BY_CLIENT| are used by the Chrome network stack |
| 2936 // to indicate that the current load should be aborted and the pending | 2930 // to indicate that the current load should be aborted and the pending |
| 2937 // entry should be kept. | 2931 // entry should be kept. |
| 2938 break; | 2932 break; |
| 2939 default: | 2933 default: |
| 2940 NOTREACHED(); | 2934 NOTREACHED(); |
| 2941 } | 2935 } |
| 2942 } | 2936 } |
| 2937 // NSURLCancelled errors with no underlying error are generated by the web | |
| 2938 // view. Early return in this case, as the web view interally handles | |
| 2939 // reattempting this load. | |
|
Eugene But (OOO till 7-30)
2015/06/19 00:52:01
Please make sure that LoadState will still be PAGE
kkhorimoto
2015/06/23 20:33:58
Done, although the fix is somewhat speculative. T
| |
| 2943 return; | 2940 return; |
| 2944 } | 2941 } |
| 2945 | 2942 |
| 2946 [self loadCompleteWithSuccess:NO]; | 2943 [self loadCompleteWithSuccess:NO]; |
| 2947 [self loadErrorInNativeView:error]; | 2944 [self loadErrorInNativeView:error]; |
| 2948 } | 2945 } |
| 2949 | 2946 |
| 2950 - (BOOL)shouldAbortLoadForCancelledURL:(const GURL &)cancelledURL { | 2947 - (BOOL)shouldAbortLoadForCancelledURL:(const GURL &)cancelledURL { |
| 2951 // Subclasses must implement this method. | 2948 // Subclasses must implement this method. |
| 2952 NOTREACHED(); | 2949 NOTREACHED(); |
| (...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3836 if (!_externalRequest || !_externalRequest->window_name) | 3833 if (!_externalRequest || !_externalRequest->window_name) |
| 3837 return @""; | 3834 return @""; |
| 3838 return _externalRequest->window_name; | 3835 return _externalRequest->window_name; |
| 3839 } | 3836 } |
| 3840 | 3837 |
| 3841 - (void)resetExternalRequest { | 3838 - (void)resetExternalRequest { |
| 3842 _externalRequest.reset(); | 3839 _externalRequest.reset(); |
| 3843 } | 3840 } |
| 3844 | 3841 |
| 3845 @end | 3842 @end |
| OLD | NEW |