| 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 <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include <cmath> | 10 #include <cmath> |
| 11 #include <memory> |
| 11 #include <utility> | 12 #include <utility> |
| 12 | 13 |
| 13 #include "base/ios/block_types.h" | 14 #include "base/ios/block_types.h" |
| 14 #import "base/ios/ns_error_util.h" | 15 #import "base/ios/ns_error_util.h" |
| 15 #include "base/ios/weak_nsobject.h" | 16 #include "base/ios/weak_nsobject.h" |
| 16 #include "base/json/json_reader.h" | 17 #include "base/json/json_reader.h" |
| 17 #include "base/json/json_writer.h" | 18 #include "base/json/json_writer.h" |
| 18 #include "base/json/string_escape.h" | 19 #include "base/json/string_escape.h" |
| 19 #include "base/logging.h" | 20 #include "base/logging.h" |
| 20 #include "base/mac/bundle_locations.h" | 21 #include "base/mac/bundle_locations.h" |
| 21 #include "base/mac/foundation_util.h" | 22 #include "base/mac/foundation_util.h" |
| 22 #include "base/mac/objc_property_releaser.h" | 23 #include "base/mac/objc_property_releaser.h" |
| 23 #include "base/mac/scoped_cftyperef.h" | 24 #include "base/mac/scoped_cftyperef.h" |
| 24 #include "base/mac/scoped_nsobject.h" | 25 #include "base/mac/scoped_nsobject.h" |
| 25 #include "base/memory/scoped_ptr.h" | |
| 26 #include "base/metrics/histogram.h" | 26 #include "base/metrics/histogram.h" |
| 27 #include "base/metrics/user_metrics_action.h" | 27 #include "base/metrics/user_metrics_action.h" |
| 28 #include "base/strings/string_util.h" | 28 #include "base/strings/string_util.h" |
| 29 #include "base/strings/sys_string_conversions.h" | 29 #include "base/strings/sys_string_conversions.h" |
| 30 #include "base/strings/utf_string_conversions.h" | 30 #include "base/strings/utf_string_conversions.h" |
| 31 #include "base/time/time.h" | 31 #include "base/time/time.h" |
| 32 #include "base/values.h" | 32 #include "base/values.h" |
| 33 #include "components/prefs/pref_service.h" | 33 #include "components/prefs/pref_service.h" |
| 34 #include "components/url_formatter/url_formatter.h" | 34 #include "components/url_formatter/url_formatter.h" |
| 35 #import "ios/net/nsurlrequest_util.h" | 35 #import "ios/net/nsurlrequest_util.h" |
| 36 #include "ios/public/provider/web/web_ui_ios.h" | 36 #include "ios/public/provider/web/web_ui_ios.h" |
| 37 #import "ios/web/crw_network_activity_indicator_manager.h" | 37 #import "ios/web/crw_network_activity_indicator_manager.h" |
| 38 #import "ios/web/history_state_util.h" | 38 #import "ios/web/history_state_util.h" |
| 39 #include "ios/web/interstitials/web_interstitial_impl.h" | 39 #include "ios/web/interstitials/web_interstitial_impl.h" |
| 40 #import "ios/web/navigation/crw_session_certificate_policy_manager.h" | 40 #import "ios/web/navigation/crw_session_certificate_policy_manager.h" |
| 41 #import "ios/web/navigation/crw_session_controller.h" | 41 #import "ios/web/navigation/crw_session_controller.h" |
| 42 #import "ios/web/navigation/crw_session_entry.h" | 42 #import "ios/web/navigation/crw_session_entry.h" |
| 43 #import "ios/web/navigation/navigation_item_impl.h" | 43 #import "ios/web/navigation/navigation_item_impl.h" |
| 44 #import "ios/web/navigation/navigation_manager_impl.h" | 44 #import "ios/web/navigation/navigation_manager_impl.h" |
| 45 #include "ios/web/net/request_group_util.h" | 45 #include "ios/web/net/request_group_util.h" |
| 46 #include "ios/web/public/browser_state.h" | 46 #include "ios/web/public/browser_state.h" |
| 47 #include "ios/web/public/favicon_url.h" | 47 #include "ios/web/public/favicon_url.h" |
| 48 #include "ios/web/public/navigation_item.h" |
| 48 #import "ios/web/public/navigation_manager.h" | 49 #import "ios/web/public/navigation_manager.h" |
| 49 #include "ios/web/public/navigation_item.h" | |
| 50 #include "ios/web/public/referrer.h" | 50 #include "ios/web/public/referrer.h" |
| 51 #include "ios/web/public/referrer_util.h" | 51 #include "ios/web/public/referrer_util.h" |
| 52 #include "ios/web/public/ssl_status.h" | 52 #include "ios/web/public/ssl_status.h" |
| 53 #import "ios/web/public/url_scheme_util.h" | 53 #import "ios/web/public/url_scheme_util.h" |
| 54 #include "ios/web/public/url_util.h" | 54 #include "ios/web/public/url_util.h" |
| 55 #include "ios/web/public/user_metrics.h" | 55 #include "ios/web/public/user_metrics.h" |
| 56 #include "ios/web/public/web_client.h" | 56 #include "ios/web/public/web_client.h" |
| 57 #include "ios/web/public/web_kit_constants.h" | 57 #include "ios/web/public/web_kit_constants.h" |
| 58 #include "ios/web/public/web_state/credential.h" | 58 #include "ios/web/public/web_state/credential.h" |
| 59 #import "ios/web/public/web_state/crw_web_controller_observer.h" | 59 #import "ios/web/public/web_state/crw_web_controller_observer.h" |
| 60 #import "ios/web/public/web_state/crw_web_view_scroll_view_proxy.h" | 60 #import "ios/web/public/web_state/crw_web_view_scroll_view_proxy.h" |
| 61 #import "ios/web/public/web_state/js/credential_util.h" | 61 #import "ios/web/public/web_state/js/credential_util.h" |
| 62 #import "ios/web/public/web_state/js/crw_js_injection_manager.h" | 62 #import "ios/web/public/web_state/js/crw_js_injection_manager.h" |
| 63 #import "ios/web/public/web_state/js/crw_js_injection_receiver.h" | 63 #import "ios/web/public/web_state/js/crw_js_injection_receiver.h" |
| 64 #import "ios/web/public/web_state/ui/crw_content_view.h" | 64 #import "ios/web/public/web_state/ui/crw_content_view.h" |
| 65 #import "ios/web/public/web_state/ui/crw_native_content.h" | 65 #import "ios/web/public/web_state/ui/crw_native_content.h" |
| 66 #import "ios/web/public/web_state/ui/crw_native_content_provider.h" | 66 #import "ios/web/public/web_state/ui/crw_native_content_provider.h" |
| 67 #import "ios/web/public/web_state/ui/crw_web_view_content_view.h" | 67 #import "ios/web/public/web_state/ui/crw_web_view_content_view.h" |
| 68 #include "ios/web/public/web_state/url_verification_constants.h" | 68 #include "ios/web/public/web_state/url_verification_constants.h" |
| 69 #include "ios/web/public/web_state/web_state.h" | 69 #include "ios/web/public/web_state/web_state.h" |
| 70 #include "ios/web/web_state/blocked_popup_info.h" | 70 #include "ios/web/web_state/blocked_popup_info.h" |
| 71 #import "ios/web/web_state/crw_web_view_proxy_impl.h" | 71 #import "ios/web/web_state/crw_web_view_proxy_impl.h" |
| 72 #import "ios/web/web_state/error_translation_util.h" | 72 #import "ios/web/web_state/error_translation_util.h" |
| 73 #include "ios/web/web_state/frame_info.h" | 73 #include "ios/web/web_state/frame_info.h" |
| 74 #import "ios/web/web_state/page_viewport_state.h" | |
| 75 #import "ios/web/web_state/js/crw_js_early_script_manager.h" | 74 #import "ios/web/web_state/js/crw_js_early_script_manager.h" |
| 76 #import "ios/web/web_state/js/crw_js_plugin_placeholder_manager.h" | 75 #import "ios/web/web_state/js/crw_js_plugin_placeholder_manager.h" |
| 77 #import "ios/web/web_state/js/crw_js_window_id_manager.h" | 76 #import "ios/web/web_state/js/crw_js_window_id_manager.h" |
| 77 #import "ios/web/web_state/page_viewport_state.h" |
| 78 #import "ios/web/web_state/ui/crw_context_menu_provider.h" | 78 #import "ios/web/web_state/ui/crw_context_menu_provider.h" |
| 79 #import "ios/web/web_state/ui/crw_swipe_recognizer_provider.h" | 79 #import "ios/web/web_state/ui/crw_swipe_recognizer_provider.h" |
| 80 #import "ios/web/web_state/ui/crw_web_controller+protected.h" | 80 #import "ios/web/web_state/ui/crw_web_controller+protected.h" |
| 81 #import "ios/web/web_state/ui/crw_web_controller_container_view.h" | 81 #import "ios/web/web_state/ui/crw_web_controller_container_view.h" |
| 82 #import "ios/web/web_state/ui/crw_wk_web_view_web_controller.h" | 82 #import "ios/web/web_state/ui/crw_wk_web_view_web_controller.h" |
| 83 #import "ios/web/web_state/web_controller_observer_bridge.h" | 83 #import "ios/web/web_state/web_controller_observer_bridge.h" |
| 84 #include "ios/web/web_state/web_state_facade_delegate.h" | 84 #include "ios/web/web_state/web_state_facade_delegate.h" |
| 85 #import "ios/web/web_state/web_state_impl.h" | 85 #import "ios/web/web_state/web_state_impl.h" |
| 86 #import "net/base/mac/url_conversions.h" | 86 #import "net/base/mac/url_conversions.h" |
| 87 #include "net/base/net_errors.h" | 87 #include "net/base/net_errors.h" |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 // The touch tracking recognizer allowing us to decide if a navigation is | 240 // The touch tracking recognizer allowing us to decide if a navigation is |
| 241 // started by the user. | 241 // started by the user. |
| 242 base::scoped_nsobject<CRWTouchTrackingRecognizer> _touchTrackingRecognizer; | 242 base::scoped_nsobject<CRWTouchTrackingRecognizer> _touchTrackingRecognizer; |
| 243 // Long press recognizer that allows showing context menus. | 243 // Long press recognizer that allows showing context menus. |
| 244 base::scoped_nsobject<UILongPressGestureRecognizer> _contextMenuRecognizer; | 244 base::scoped_nsobject<UILongPressGestureRecognizer> _contextMenuRecognizer; |
| 245 // DOM element information for the point where the user made the last touch. | 245 // DOM element information for the point where the user made the last touch. |
| 246 // Can be null if has not been calculated yet. Precalculation is necessary | 246 // Can be null if has not been calculated yet. Precalculation is necessary |
| 247 // because retreiving DOM element relies on async API so element info can not | 247 // because retreiving DOM element relies on async API so element info can not |
| 248 // be built on demand. May contain the following keys: "href", "src", "title", | 248 // be built on demand. May contain the following keys: "href", "src", "title", |
| 249 // "referrerPolicy". All values are strings. Used for showing context menus. | 249 // "referrerPolicy". All values are strings. Used for showing context menus. |
| 250 scoped_ptr<base::DictionaryValue> _DOMElementForLastTouch; | 250 std::unique_ptr<base::DictionaryValue> _DOMElementForLastTouch; |
| 251 // Whether a click is in progress. | 251 // Whether a click is in progress. |
| 252 BOOL _clickInProgress; | 252 BOOL _clickInProgress; |
| 253 // Data on the recorded last user interaction. | 253 // Data on the recorded last user interaction. |
| 254 scoped_ptr<web::UserInteractionEvent> _lastUserInteraction; | 254 std::unique_ptr<web::UserInteractionEvent> _lastUserInteraction; |
| 255 // YES if there has been user interaction with views owned by this controller. | 255 // YES if there has been user interaction with views owned by this controller. |
| 256 BOOL _userInteractedWithWebController; | 256 BOOL _userInteractedWithWebController; |
| 257 // The time of the last page transfer start, measured in seconds since Jan 1 | 257 // The time of the last page transfer start, measured in seconds since Jan 1 |
| 258 // 2001. | 258 // 2001. |
| 259 CFAbsoluteTime _lastTransferTimeInSeconds; | 259 CFAbsoluteTime _lastTransferTimeInSeconds; |
| 260 // Default URL (about:blank). | 260 // Default URL (about:blank). |
| 261 GURL _defaultURL; | 261 GURL _defaultURL; |
| 262 // Show overlay view, don't reload web page. | 262 // Show overlay view, don't reload web page. |
| 263 BOOL _overlayPreviewMode; | 263 BOOL _overlayPreviewMode; |
| 264 // If |YES|, calls |setShouldSuppressDialogs:YES| when window id is injected | 264 // If |YES|, calls |setShouldSuppressDialogs:YES| when window id is injected |
| 265 // into the web view. | 265 // into the web view. |
| 266 BOOL _shouldSuppressDialogsOnWindowIDInjection; | 266 BOOL _shouldSuppressDialogsOnWindowIDInjection; |
| 267 // The URL of an expected future recreation of the |webView|. Valid | 267 // The URL of an expected future recreation of the |webView|. Valid |
| 268 // only if the web view was discarded for non-user-visible reasons, such that | 268 // only if the web view was discarded for non-user-visible reasons, such that |
| 269 // if the next load request is for that URL, it should be treated as a | 269 // if the next load request is for that URL, it should be treated as a |
| 270 // reconstruction that should use cache aggressively. | 270 // reconstruction that should use cache aggressively. |
| 271 GURL _expectedReconstructionURL; | 271 GURL _expectedReconstructionURL; |
| 272 // Whether the web page is currently performing window.history.pushState or | 272 // Whether the web page is currently performing window.history.pushState or |
| 273 // window.history.replaceState | 273 // window.history.replaceState |
| 274 // Set to YES on window.history.willChangeState message. To NO on | 274 // Set to YES on window.history.willChangeState message. To NO on |
| 275 // window.history.didPushState or window.history.didReplaceState. | 275 // window.history.didPushState or window.history.didReplaceState. |
| 276 BOOL _changingHistoryState; | 276 BOOL _changingHistoryState; |
| 277 | 277 |
| 278 scoped_ptr<web::NewWindowInfo> _externalRequest; | 278 std::unique_ptr<web::NewWindowInfo> _externalRequest; |
| 279 | 279 |
| 280 // The WebStateImpl instance associated with this CRWWebController. | 280 // The WebStateImpl instance associated with this CRWWebController. |
| 281 scoped_ptr<WebStateImpl> _webStateImpl; | 281 std::unique_ptr<WebStateImpl> _webStateImpl; |
| 282 | 282 |
| 283 // A set of URLs opened in external applications; stored so that errors | 283 // A set of URLs opened in external applications; stored so that errors |
| 284 // from the web view can be identified as resulting from these events. | 284 // from the web view can be identified as resulting from these events. |
| 285 base::scoped_nsobject<NSMutableSet> _openedApplicationURL; | 285 base::scoped_nsobject<NSMutableSet> _openedApplicationURL; |
| 286 | 286 |
| 287 // Object that manages all early script injection into the web view. | 287 // Object that manages all early script injection into the web view. |
| 288 base::scoped_nsobject<CRWJSEarlyScriptManager> _earlyScriptManager; | 288 base::scoped_nsobject<CRWJSEarlyScriptManager> _earlyScriptManager; |
| 289 | 289 |
| 290 // Script manager for setting the windowID. | 290 // Script manager for setting the windowID. |
| 291 base::scoped_nsobject<CRWJSWindowIdManager> _windowIDJSManager; | 291 base::scoped_nsobject<CRWJSWindowIdManager> _windowIDJSManager; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 - (BOOL)shouldClosePageOnNativeApplicationLoad; | 343 - (BOOL)shouldClosePageOnNativeApplicationLoad; |
| 344 // Called after URL is finished loading and _loadPhase is set to PAGE_LOADED. | 344 // Called after URL is finished loading and _loadPhase is set to PAGE_LOADED. |
| 345 - (void)didFinishWithURL:(const GURL&)currentURL loadSuccess:(BOOL)loadSuccess; | 345 - (void)didFinishWithURL:(const GURL&)currentURL loadSuccess:(BOOL)loadSuccess; |
| 346 // Informs the native controller if web usage is allowed or not. | 346 // Informs the native controller if web usage is allowed or not. |
| 347 - (void)setNativeControllerWebUsageEnabled:(BOOL)webUsageEnabled; | 347 - (void)setNativeControllerWebUsageEnabled:(BOOL)webUsageEnabled; |
| 348 // Evaluates the supplied JavaScript in the web view. Calls |handler| with | 348 // Evaluates the supplied JavaScript in the web view. Calls |handler| with |
| 349 // results of the evaluation (which may be nil if the implementing object has no | 349 // results of the evaluation (which may be nil if the implementing object has no |
| 350 // way to run the evaluation or the evaluation returns a nil value) or an | 350 // way to run the evaluation or the evaluation returns a nil value) or an |
| 351 // NSError if there is an error. The |handler| can be nil. | 351 // NSError if there is an error. The |handler| can be nil. |
| 352 - (void)evaluateJavaScript:(NSString*)script | 352 - (void)evaluateJavaScript:(NSString*)script |
| 353 JSONResultHandler:(void (^)(scoped_ptr<base::Value>, NSError*))handler; | 353 JSONResultHandler: |
| 354 (void (^)(std::unique_ptr<base::Value>, NSError*))handler; |
| 354 // Attempts to handle a script message. Returns YES on success, NO otherwise. | 355 // Attempts to handle a script message. Returns YES on success, NO otherwise. |
| 355 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage; | 356 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage; |
| 356 // Generates the JavaScript string used to update the UIWebView's URL so that it | 357 // Generates the JavaScript string used to update the UIWebView's URL so that it |
| 357 // matches the URL displayed in the omnibox and sets window.history.state to | 358 // matches the URL displayed in the omnibox and sets window.history.state to |
| 358 // stateObject. Needed for history.pushState() and history.replaceState(). | 359 // stateObject. Needed for history.pushState() and history.replaceState(). |
| 359 - (NSString*)javascriptToReplaceWebViewURL:(const GURL&)URL | 360 - (NSString*)javascriptToReplaceWebViewURL:(const GURL&)URL |
| 360 stateObjectJSON:(NSString*)stateObject; | 361 stateObjectJSON:(NSString*)stateObject; |
| 361 // Injects JavaScript into the web view to update the URL to |URL|, to set | 362 // Injects JavaScript into the web view to update the URL to |URL|, to set |
| 362 // window.history.state to |stateObject|, and to trigger a popstate() event. | 363 // window.history.state to |stateObject|, and to trigger a popstate() event. |
| 363 // Upon the scripts completion, resets |urlOnStartLoading_| and | 364 // Upon the scripts completion, resets |urlOnStartLoading_| and |
| (...skipping 26 matching lines...) Expand all Loading... |
| 390 // Sets scroll offset value for webview scroll view from |scrollState|. | 391 // Sets scroll offset value for webview scroll view from |scrollState|. |
| 391 - (void)applyWebViewScrollOffsetFromScrollState: | 392 - (void)applyWebViewScrollOffsetFromScrollState: |
| 392 (const web::PageScrollState&)scrollState; | 393 (const web::PageScrollState&)scrollState; |
| 393 // Asynchronously fetches full width of the rendered web page. | 394 // Asynchronously fetches full width of the rendered web page. |
| 394 - (void)fetchWebPageWidthWithCompletionHandler:(void (^)(CGFloat))handler; | 395 - (void)fetchWebPageWidthWithCompletionHandler:(void (^)(CGFloat))handler; |
| 395 // Asynchronously fetches information about DOM element for the given point (in | 396 // Asynchronously fetches information about DOM element for the given point (in |
| 396 // UIView coordinates). |handler| can not be nil. See |_DOMElementForLastTouch| | 397 // UIView coordinates). |handler| can not be nil. See |_DOMElementForLastTouch| |
| 397 // for element format description. | 398 // for element format description. |
| 398 - (void)fetchDOMElementAtPoint:(CGPoint)point | 399 - (void)fetchDOMElementAtPoint:(CGPoint)point |
| 399 completionHandler: | 400 completionHandler: |
| 400 (void (^)(scoped_ptr<base::DictionaryValue>))handler; | 401 (void (^)(std::unique_ptr<base::DictionaryValue>))handler; |
| 401 // Extracts context menu information from the given DOM element. | 402 // Extracts context menu information from the given DOM element. |
| 402 // result keys are defined in crw_context_menu_provider.h. | 403 // result keys are defined in crw_context_menu_provider.h. |
| 403 - (NSDictionary*)contextMenuInfoForElement:(base::DictionaryValue*)element; | 404 - (NSDictionary*)contextMenuInfoForElement:(base::DictionaryValue*)element; |
| 404 // Sets the value of |_DOMElementForLastTouch|. | 405 // Sets the value of |_DOMElementForLastTouch|. |
| 405 - (void)setDOMElementForLastTouch:(scoped_ptr<base::DictionaryValue>)element; | 406 - (void)setDOMElementForLastTouch: |
| 407 (std::unique_ptr<base::DictionaryValue>)element; |
| 406 // Called when the window has determined there was a long-press and context menu | 408 // Called when the window has determined there was a long-press and context menu |
| 407 // must be shown. | 409 // must be shown. |
| 408 - (void)showContextMenu:(UIGestureRecognizer*)gestureRecognizer; | 410 - (void)showContextMenu:(UIGestureRecognizer*)gestureRecognizer; |
| 409 // YES if delegate supports showing context menu by responding to | 411 // YES if delegate supports showing context menu by responding to |
| 410 // webController:runContextMenu:atPoint:inView: selector. | 412 // webController:runContextMenu:atPoint:inView: selector. |
| 411 - (BOOL)supportsCustomContextMenu; | 413 - (BOOL)supportsCustomContextMenu; |
| 412 // Cancels all touch events in the web view (long presses, tapping, scrolling). | 414 // Cancels all touch events in the web view (long presses, tapping, scrolling). |
| 413 - (void)cancelAllTouches; | 415 - (void)cancelAllTouches; |
| 414 // Returns the referrer for the current page. | 416 // Returns the referrer for the current page. |
| 415 - (web::Referrer)currentReferrer; | 417 - (web::Referrer)currentReferrer; |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 + (instancetype)allocWithZone:(struct _NSZone*)zone { | 571 + (instancetype)allocWithZone:(struct _NSZone*)zone { |
| 570 if (self == [CRWWebController class]) { | 572 if (self == [CRWWebController class]) { |
| 571 // This is an abstract class which should not be instantiated directly. | 573 // This is an abstract class which should not be instantiated directly. |
| 572 // Callers should create concrete subclasses instead. | 574 // Callers should create concrete subclasses instead. |
| 573 NOTREACHED(); | 575 NOTREACHED(); |
| 574 return nil; | 576 return nil; |
| 575 } | 577 } |
| 576 return [super allocWithZone:zone]; | 578 return [super allocWithZone:zone]; |
| 577 } | 579 } |
| 578 | 580 |
| 579 - (instancetype)initWithWebState:(scoped_ptr<WebStateImpl>)webState { | 581 - (instancetype)initWithWebState:(std::unique_ptr<WebStateImpl>)webState { |
| 580 self = [super init]; | 582 self = [super init]; |
| 581 if (self) { | 583 if (self) { |
| 582 _webStateImpl = std::move(webState); | 584 _webStateImpl = std::move(webState); |
| 583 DCHECK(_webStateImpl); | 585 DCHECK(_webStateImpl); |
| 584 _webStateImpl->SetWebController(self); | 586 _webStateImpl->SetWebController(self); |
| 585 _webStateImpl->InitializeRequestTracker(self); | 587 _webStateImpl->InitializeRequestTracker(self); |
| 586 // Load phase when no WebView present is 'loaded' because this represents | 588 // Load phase when no WebView present is 'loaded' because this represents |
| 587 // the idle state. | 589 // the idle state. |
| 588 _loadPhase = web::PAGE_LOADED; | 590 _loadPhase = web::PAGE_LOADED; |
| 589 // Content area is lazily instantiated. | 591 // Content area is lazily instantiated. |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 | 875 |
| 874 // Tear down web ui (in case this is part of this tab) and web state now, | 876 // Tear down web ui (in case this is part of this tab) and web state now, |
| 875 // since the timing of dealloc can't be guaranteed. | 877 // since the timing of dealloc can't be guaranteed. |
| 876 _webStateImpl.reset(); | 878 _webStateImpl.reset(); |
| 877 } | 879 } |
| 878 | 880 |
| 879 - (void)checkLinkPresenceUnderGesture:(UIGestureRecognizer*)gestureRecognizer | 881 - (void)checkLinkPresenceUnderGesture:(UIGestureRecognizer*)gestureRecognizer |
| 880 completionHandler:(void (^)(BOOL))completionHandler { | 882 completionHandler:(void (^)(BOOL))completionHandler { |
| 881 CGPoint webViewPoint = [gestureRecognizer locationInView:self.webView]; | 883 CGPoint webViewPoint = [gestureRecognizer locationInView:self.webView]; |
| 882 base::WeakNSObject<CRWWebController> weakSelf(self); | 884 base::WeakNSObject<CRWWebController> weakSelf(self); |
| 883 [self fetchDOMElementAtPoint:webViewPoint | 885 [self |
| 884 completionHandler:^(scoped_ptr<base::DictionaryValue> element) { | 886 fetchDOMElementAtPoint:webViewPoint |
| 885 std::string link; | 887 completionHandler:^(std::unique_ptr<base::DictionaryValue> element) { |
| 886 BOOL hasLink = | 888 std::string link; |
| 887 element && element->GetString("href", &link) && link.size(); | 889 BOOL hasLink = |
| 888 completionHandler(hasLink); | 890 element && element->GetString("href", &link) && link.size(); |
| 889 }]; | 891 completionHandler(hasLink); |
| 892 }]; |
| 890 } | 893 } |
| 891 | 894 |
| 892 - (void)setDOMElementForLastTouch:(scoped_ptr<base::DictionaryValue>)element { | 895 - (void)setDOMElementForLastTouch: |
| 896 (std::unique_ptr<base::DictionaryValue>)element { |
| 893 _DOMElementForLastTouch = std::move(element); | 897 _DOMElementForLastTouch = std::move(element); |
| 894 } | 898 } |
| 895 | 899 |
| 896 - (void)showContextMenu:(UIGestureRecognizer*)gestureRecognizer { | 900 - (void)showContextMenu:(UIGestureRecognizer*)gestureRecognizer { |
| 897 // Calling this method if [self supportsCustomContextMenu] returned NO | 901 // Calling this method if [self supportsCustomContextMenu] returned NO |
| 898 // is a programmer error. | 902 // is a programmer error. |
| 899 DCHECK([self supportsCustomContextMenu]); | 903 DCHECK([self supportsCustomContextMenu]); |
| 900 | 904 |
| 901 // We don't want ongoing notification that the long press is held. | 905 // We don't want ongoing notification that the long press is held. |
| 902 if ([gestureRecognizer state] != UIGestureRecognizerStateBegan) | 906 if ([gestureRecognizer state] != UIGestureRecognizerStateBegan) |
| (...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1847 | 1851 |
| 1848 url::StringPieceReplacements<std::string> emptyRef; | 1852 url::StringPieceReplacements<std::string> emptyRef; |
| 1849 emptyRef.SetRefStr(""); | 1853 emptyRef.SetRefStr(""); |
| 1850 GURL newEndURL = endURL.ReplaceComponents(emptyRef); | 1854 GURL newEndURL = endURL.ReplaceComponents(emptyRef); |
| 1851 toItem->SetURL(newEndURL); | 1855 toItem->SetURL(newEndURL); |
| 1852 return newEndURL; | 1856 return newEndURL; |
| 1853 } | 1857 } |
| 1854 | 1858 |
| 1855 - (void)evaluateJavaScript:(NSString*)script | 1859 - (void)evaluateJavaScript:(NSString*)script |
| 1856 JSONResultHandler: | 1860 JSONResultHandler: |
| 1857 (void (^)(scoped_ptr<base::Value>, NSError*))handler { | 1861 (void (^)(std::unique_ptr<base::Value>, NSError*))handler { |
| 1858 [self evaluateJavaScript:script | 1862 [self evaluateJavaScript:script |
| 1859 stringResultHandler:^(NSString* stringResult, NSError* error) { | 1863 stringResultHandler:^(NSString* stringResult, NSError* error) { |
| 1860 DCHECK(stringResult || error); | 1864 DCHECK(stringResult || error); |
| 1861 if (handler) { | 1865 if (handler) { |
| 1862 scoped_ptr<base::Value> result( | 1866 std::unique_ptr<base::Value> result( |
| 1863 base::JSONReader::Read(base::SysNSStringToUTF8(stringResult))); | 1867 base::JSONReader::Read(base::SysNSStringToUTF8(stringResult))); |
| 1864 handler(std::move(result), error); | 1868 handler(std::move(result), error); |
| 1865 } | 1869 } |
| 1866 }]; | 1870 }]; |
| 1867 } | 1871 } |
| 1868 | 1872 |
| 1869 - (void)addGestureRecognizerToWebView:(UIGestureRecognizer*)recognizer { | 1873 - (void)addGestureRecognizerToWebView:(UIGestureRecognizer*)recognizer { |
| 1870 if ([_gestureRecognizers containsObject:recognizer]) | 1874 if ([_gestureRecognizers containsObject:recognizer]) |
| 1871 return; | 1875 return; |
| 1872 | 1876 |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2126 // Broken out into separate method to catch errors. | 2130 // Broken out into separate method to catch errors. |
| 2127 if (![self respondToWKScriptMessage:message]) { | 2131 if (![self respondToWKScriptMessage:message]) { |
| 2128 DLOG(WARNING) << "Message from JS not handled due to invalid format"; | 2132 DLOG(WARNING) << "Message from JS not handled due to invalid format"; |
| 2129 } | 2133 } |
| 2130 } | 2134 } |
| 2131 | 2135 |
| 2132 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage { | 2136 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage { |
| 2133 CHECK(scriptMessage.frameInfo.mainFrame); | 2137 CHECK(scriptMessage.frameInfo.mainFrame); |
| 2134 int errorCode = 0; | 2138 int errorCode = 0; |
| 2135 std::string errorMessage; | 2139 std::string errorMessage; |
| 2136 scoped_ptr<base::Value> inputJSONData(base::JSONReader::ReadAndReturnError( | 2140 std::unique_ptr<base::Value> inputJSONData( |
| 2137 base::SysNSStringToUTF8(scriptMessage.body), false, &errorCode, | 2141 base::JSONReader::ReadAndReturnError( |
| 2138 &errorMessage)); | 2142 base::SysNSStringToUTF8(scriptMessage.body), false, &errorCode, |
| 2143 &errorMessage)); |
| 2139 if (errorCode) { | 2144 if (errorCode) { |
| 2140 DLOG(WARNING) << "JSON parse error: %s" << errorMessage.c_str(); | 2145 DLOG(WARNING) << "JSON parse error: %s" << errorMessage.c_str(); |
| 2141 return NO; | 2146 return NO; |
| 2142 } | 2147 } |
| 2143 base::DictionaryValue* message = nullptr; | 2148 base::DictionaryValue* message = nullptr; |
| 2144 if (!inputJSONData->GetAsDictionary(&message)) { | 2149 if (!inputJSONData->GetAsDictionary(&message)) { |
| 2145 return NO; | 2150 return NO; |
| 2146 } | 2151 } |
| 2147 std::string windowID; | 2152 std::string windowID; |
| 2148 message->GetString("crwWindowId", &windowID); | 2153 message->GetString("crwWindowId", &windowID); |
| (...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3035 return YES; | 3040 return YES; |
| 3036 } | 3041 } |
| 3037 | 3042 |
| 3038 // This is custom long press gesture recognizer. By the time the gesture is | 3043 // This is custom long press gesture recognizer. By the time the gesture is |
| 3039 // recognized the web controller needs to know if there is a link under the | 3044 // recognized the web controller needs to know if there is a link under the |
| 3040 // touch. If there a link, the web controller will reject system's context | 3045 // touch. If there a link, the web controller will reject system's context |
| 3041 // menu and show another one. If for some reason context menu info is not | 3046 // menu and show another one. If for some reason context menu info is not |
| 3042 // fetched - system context menu will be shown. | 3047 // fetched - system context menu will be shown. |
| 3043 [self setDOMElementForLastTouch:nullptr]; | 3048 [self setDOMElementForLastTouch:nullptr]; |
| 3044 base::WeakNSObject<CRWWebController> weakSelf(self); | 3049 base::WeakNSObject<CRWWebController> weakSelf(self); |
| 3045 [self fetchDOMElementAtPoint:[touch locationInView:self.webView] | 3050 [self |
| 3046 completionHandler:^(scoped_ptr<base::DictionaryValue> element) { | 3051 fetchDOMElementAtPoint:[touch locationInView:self.webView] |
| 3047 [weakSelf setDOMElementForLastTouch:std::move(element)]; | 3052 completionHandler:^(std::unique_ptr<base::DictionaryValue> element) { |
| 3048 }]; | 3053 [weakSelf setDOMElementForLastTouch:std::move(element)]; |
| 3054 }]; |
| 3049 return YES; | 3055 return YES; |
| 3050 } | 3056 } |
| 3051 | 3057 |
| 3052 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer { | 3058 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer { |
| 3053 // Expect only _contextMenuRecognizer. | 3059 // Expect only _contextMenuRecognizer. |
| 3054 DCHECK([gestureRecognizer isEqual:_contextMenuRecognizer]); | 3060 DCHECK([gestureRecognizer isEqual:_contextMenuRecognizer]); |
| 3055 if (!self.webView || ![self supportsCustomContextMenu]) { | 3061 if (!self.webView || ![self supportsCustomContextMenu]) { |
| 3056 // Show the context menu iff currently displaying a web view. | 3062 // Show the context menu iff currently displaying a web view. |
| 3057 // Do nothing for native views. | 3063 // Do nothing for native views. |
| 3058 return NO; | 3064 return NO; |
| (...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3597 } | 3603 } |
| 3598 | 3604 |
| 3599 [self evaluateJavaScript:@"__gCrWeb.getPageWidth();" | 3605 [self evaluateJavaScript:@"__gCrWeb.getPageWidth();" |
| 3600 stringResultHandler:^(NSString* pageWidthAsString, NSError*) { | 3606 stringResultHandler:^(NSString* pageWidthAsString, NSError*) { |
| 3601 handler([pageWidthAsString floatValue]); | 3607 handler([pageWidthAsString floatValue]); |
| 3602 }]; | 3608 }]; |
| 3603 } | 3609 } |
| 3604 | 3610 |
| 3605 - (void)fetchDOMElementAtPoint:(CGPoint)point | 3611 - (void)fetchDOMElementAtPoint:(CGPoint)point |
| 3606 completionHandler: | 3612 completionHandler: |
| 3607 (void (^)(scoped_ptr<base::DictionaryValue>))handler { | 3613 (void (^)(std::unique_ptr<base::DictionaryValue>))handler { |
| 3608 DCHECK(handler); | 3614 DCHECK(handler); |
| 3609 // Convert point into web page's coordinate system (which may be scaled and/or | 3615 // Convert point into web page's coordinate system (which may be scaled and/or |
| 3610 // scrolled). | 3616 // scrolled). |
| 3611 CGPoint scrollOffset = self.scrollPosition; | 3617 CGPoint scrollOffset = self.scrollPosition; |
| 3612 CGFloat webViewContentWidth = self.webScrollView.contentSize.width; | 3618 CGFloat webViewContentWidth = self.webScrollView.contentSize.width; |
| 3613 base::WeakNSObject<CRWWebController> weakSelf(self); | 3619 base::WeakNSObject<CRWWebController> weakSelf(self); |
| 3614 [self fetchWebPageWidthWithCompletionHandler:^(CGFloat pageWidth) { | 3620 [self fetchWebPageWidthWithCompletionHandler:^(CGFloat pageWidth) { |
| 3615 CGFloat scale = pageWidth / webViewContentWidth; | 3621 CGFloat scale = pageWidth / webViewContentWidth; |
| 3616 CGPoint localPoint = CGPointMake((point.x + scrollOffset.x) * scale, | 3622 CGPoint localPoint = CGPointMake((point.x + scrollOffset.x) * scale, |
| 3617 (point.y + scrollOffset.y) * scale); | 3623 (point.y + scrollOffset.y) * scale); |
| 3618 NSString* const kGetElementScript = | 3624 NSString* const kGetElementScript = |
| 3619 [NSString stringWithFormat:@"__gCrWeb.getElementFromPoint(%g, %g);", | 3625 [NSString stringWithFormat:@"__gCrWeb.getElementFromPoint(%g, %g);", |
| 3620 localPoint.x, localPoint.y]; | 3626 localPoint.x, localPoint.y]; |
| 3621 [weakSelf evaluateJavaScript:kGetElementScript | 3627 [weakSelf |
| 3622 JSONResultHandler:^(scoped_ptr<base::Value> element, NSError*) { | 3628 evaluateJavaScript:kGetElementScript |
| 3623 // Release raw element and call handler with DictionaryValue. | 3629 JSONResultHandler:^(std::unique_ptr<base::Value> element, NSError*) { |
| 3624 scoped_ptr<base::DictionaryValue> elementAsDict; | 3630 // Release raw element and call handler with DictionaryValue. |
| 3625 if (element) { | 3631 std::unique_ptr<base::DictionaryValue> elementAsDict; |
| 3626 base::DictionaryValue* elementAsDictPtr = nullptr; | 3632 if (element) { |
| 3627 element.release()->GetAsDictionary(&elementAsDictPtr); | 3633 base::DictionaryValue* elementAsDictPtr = nullptr; |
| 3628 // |rawElement| and |elementPtr| now point to the same | 3634 element.release()->GetAsDictionary(&elementAsDictPtr); |
| 3629 // memory. |elementPtr| ownership will be transferred to | 3635 // |rawElement| and |elementPtr| now point to the same |
| 3630 // |element| scoped_ptr. | 3636 // memory. |elementPtr| ownership will be transferred to |
| 3631 elementAsDict.reset(elementAsDictPtr); | 3637 // |element| scoped_ptr. |
| 3632 } | 3638 elementAsDict.reset(elementAsDictPtr); |
| 3633 handler(std::move(elementAsDict)); | 3639 } |
| 3634 }]; | 3640 handler(std::move(elementAsDict)); |
| 3641 }]; |
| 3635 }]; | 3642 }]; |
| 3636 } | 3643 } |
| 3637 | 3644 |
| 3638 - (NSDictionary*)contextMenuInfoForElement:(base::DictionaryValue*)element { | 3645 - (NSDictionary*)contextMenuInfoForElement:(base::DictionaryValue*)element { |
| 3639 DCHECK(element); | 3646 DCHECK(element); |
| 3640 NSMutableDictionary* mutableInfo = [NSMutableDictionary dictionary]; | 3647 NSMutableDictionary* mutableInfo = [NSMutableDictionary dictionary]; |
| 3641 NSString* title = nil; | 3648 NSString* title = nil; |
| 3642 std::string href; | 3649 std::string href; |
| 3643 if (element->GetString("href", &href)) { | 3650 if (element->GetString("href", &href)) { |
| 3644 mutableInfo[web::kContextLinkURLString] = base::SysUTF8ToNSString(href); | 3651 mutableInfo[web::kContextLinkURLString] = base::SysUTF8ToNSString(href); |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3948 if ([MIMEType isEqualToString:@"text/html"] || | 3955 if ([MIMEType isEqualToString:@"text/html"] || |
| 3949 [MIMEType isEqualToString:@"application/xhtml+xml"] || | 3956 [MIMEType isEqualToString:@"application/xhtml+xml"] || |
| 3950 [MIMEType isEqualToString:@"application/xml"]) { | 3957 [MIMEType isEqualToString:@"application/xml"]) { |
| 3951 return web::WEB_VIEW_DOCUMENT_TYPE_HTML; | 3958 return web::WEB_VIEW_DOCUMENT_TYPE_HTML; |
| 3952 } | 3959 } |
| 3953 | 3960 |
| 3954 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; | 3961 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; |
| 3955 } | 3962 } |
| 3956 | 3963 |
| 3957 @end | 3964 @end |
| OLD | NEW |