| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #include "ios/chrome/browser/ui/contextual_search/contextual_search_results_view
.h" | 5 #include "ios/chrome/browser/ui/contextual_search/contextual_search_results_view
.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #import "base/ios/weak_nsobject.h" | 9 #import "base/ios/weak_nsobject.h" |
| 10 #include "base/mac/scoped_nsobject.h" | 10 #include "base/mac/scoped_nsobject.h" |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "ios/chrome/browser/browser_state/chrome_browser_state.h" | 12 #include "ios/chrome/browser/browser_state/chrome_browser_state.h" |
| 13 #import "ios/chrome/browser/tabs/legacy_tab_helper.h" | 13 #import "ios/chrome/browser/tabs/legacy_tab_helper.h" |
| 14 #import "ios/chrome/browser/tabs/tab.h" | 14 #import "ios/chrome/browser/tabs/tab.h" |
| 15 #import "ios/chrome/browser/tabs/tab_helper_util.h" | 15 #import "ios/chrome/browser/tabs/tab_helper_util.h" |
| 16 #import "ios/chrome/browser/tabs/tab_private.h" | 16 #import "ios/chrome/browser/tabs/tab_private.h" |
| 17 #import "ios/chrome/browser/ui/contextual_search/contextual_search_metrics.h" | 17 #import "ios/chrome/browser/ui/contextual_search/contextual_search_metrics.h" |
| 18 #import "ios/chrome/browser/ui/contextual_search/contextual_search_panel_view.h" | 18 #import "ios/chrome/browser/ui/contextual_search/contextual_search_panel_view.h" |
| 19 #import "ios/chrome/browser/ui/contextual_search/contextual_search_web_state_obs
erver.h" | 19 #import "ios/chrome/browser/ui/contextual_search/contextual_search_web_state_obs
erver.h" |
| 20 #import "ios/chrome/browser/web_state_list/web_state_opener.h" | 20 #import "ios/chrome/browser/web_state_list/web_state_opener.h" |
| 21 #import "ios/chrome/common/material_timing.h" | 21 #import "ios/chrome/common/material_timing.h" |
| 22 #include "ios/web/public/load_committed_details.h" | 22 #include "ios/web/public/load_committed_details.h" |
| 23 #import "ios/web/public/serializable_user_data_manager.h" | 23 #import "ios/web/public/serializable_user_data_manager.h" |
| 24 #import "ios/web/public/web_state/ui/crw_native_content_provider.h" | 24 #import "ios/web/public/web_state/ui/crw_native_content_provider.h" |
| 25 #import "ios/web/public/web_state/ui/crw_web_view_proxy.h" | 25 #import "ios/web/public/web_state/ui/crw_web_view_proxy.h" |
| 26 #import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h" | 26 #import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h" |
| 27 #import "ios/web/public/web_state/web_state.h" | 27 #import "ios/web/public/web_state/web_state.h" |
| 28 #import "ios/web/web_state/ui/crw_web_controller.h" | 28 #import "ios/web/web_state/ui/crw_web_controller.h" |
| 29 | 29 |
| 30 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 31 #error "This file requires ARC support." |
| 32 #endif |
| 33 |
| 30 namespace { | 34 namespace { |
| 31 enum SearchResultsViewVisibility { OFFSCREEN, PRELOAD, VISIBLE }; | 35 enum SearchResultsViewVisibility { OFFSCREEN, PRELOAD, VISIBLE }; |
| 32 } | 36 } |
| 33 | 37 |
| 34 @interface ContextualSearchResultsView ()<ContextualSearchWebStateDelegate, | 38 @interface ContextualSearchResultsView ()<ContextualSearchWebStateDelegate, |
| 35 CRWNativeContentProvider> | 39 CRWNativeContentProvider> |
| 36 | 40 |
| 37 // Can the search results be scrolled currently? | 41 // Can the search results be scrolled currently? |
| 38 @property(nonatomic, assign, getter=isScrollEnabled) BOOL scrollEnabled; | 42 @property(nonatomic, assign, getter=isScrollEnabled) BOOL scrollEnabled; |
| 39 @end | 43 @end |
| 40 | 44 |
| 41 @implementation ContextualSearchResultsView { | 45 @implementation ContextualSearchResultsView { |
| 42 base::WeakNSProtocol<id<ContextualSearchTabPromoter>> _promoter; | |
| 43 base::WeakNSProtocol<id<ContextualSearchPreloadChecker>> _preloadChecker; | |
| 44 std::unique_ptr<ContextualSearchWebStateObserver> _webStateObserver; | 46 std::unique_ptr<ContextualSearchWebStateObserver> _webStateObserver; |
| 45 | 47 |
| 46 // WebState that loads the search results. | 48 // WebState that loads the search results. |
| 47 std::unique_ptr<web::WebState> _webState; | 49 std::unique_ptr<web::WebState> _webState; |
| 48 std::unique_ptr<WebStateOpener> _webStateOpener; | 50 std::unique_ptr<WebStateOpener> _webStateOpener; |
| 49 | 51 |
| 50 // Access to the search tab's web view proxy. | 52 // Access to the search tab's web view proxy. |
| 51 base::scoped_nsprotocol<id<CRWWebViewProxy>> _webViewProxy; | 53 id<CRWWebViewProxy> _webViewProxy; |
| 52 | 54 |
| 53 BOOL _loaded; | 55 BOOL _loaded; |
| 54 BOOL _displayed; | 56 BOOL _displayed; |
| 55 BOOL _loadingError; | 57 BOOL _loadingError; |
| 56 BOOL _waitingForInitialSearchTabLoad; | 58 BOOL _waitingForInitialSearchTabLoad; |
| 57 BOOL _loadInProgress; | 59 BOOL _loadInProgress; |
| 58 BOOL _shouldScroll; | 60 BOOL _shouldScroll; |
| 59 | 61 |
| 60 BOOL _preloadEnabled; | 62 BOOL _preloadEnabled; |
| 61 | 63 |
| 62 SearchResultsViewVisibility _visibility; | 64 SearchResultsViewVisibility _visibility; |
| 63 | 65 |
| 64 // Time of starting a search results page load. | 66 // Time of starting a search results page load. |
| 65 base::Time _loadStartTime; | 67 base::Time _loadStartTime; |
| 66 } | 68 } |
| 67 | 69 |
| 68 @synthesize active = _active; | 70 @synthesize active = _active; |
| 69 @synthesize opener = _opener; | 71 @synthesize opener = _opener; |
| 72 @synthesize promoter = _promoter; |
| 73 @synthesize preloadChecker = _preloadChecker; |
| 70 | 74 |
| 71 - (instancetype)initWithFrame:(CGRect)frame { | 75 - (instancetype)initWithFrame:(CGRect)frame { |
| 72 if ((self = [super initWithFrame:frame])) { | 76 if ((self = [super initWithFrame:frame])) { |
| 73 self.translatesAutoresizingMaskIntoConstraints = NO; | 77 self.translatesAutoresizingMaskIntoConstraints = NO; |
| 74 self.backgroundColor = [UIColor whiteColor]; | 78 self.backgroundColor = [UIColor whiteColor]; |
| 75 self.accessibilityIdentifier = @"contextualSearchResultsView"; | 79 self.accessibilityIdentifier = @"contextualSearchResultsView"; |
| 76 self.clipsToBounds = YES; | 80 self.clipsToBounds = YES; |
| 77 _webStateObserver.reset(new ContextualSearchWebStateObserver(self)); | 81 _webStateObserver.reset(new ContextualSearchWebStateObserver(self)); |
| 78 _visibility = OFFSCREEN; | 82 _visibility = OFFSCREEN; |
| 79 } | 83 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 91 [[_webViewProxy scrollViewProxy] setBounces:NO]; | 95 [[_webViewProxy scrollViewProxy] setBounces:NO]; |
| 92 } | 96 } |
| 93 | 97 |
| 94 #pragma mark - public properties | 98 #pragma mark - public properties |
| 95 | 99 |
| 96 - (id<ContextualSearchTabPromoter>)promoter { | 100 - (id<ContextualSearchTabPromoter>)promoter { |
| 97 return _promoter; | 101 return _promoter; |
| 98 } | 102 } |
| 99 | 103 |
| 100 - (void)setPromoter:(id<ContextualSearchTabPromoter>)promoter { | 104 - (void)setPromoter:(id<ContextualSearchTabPromoter>)promoter { |
| 101 _promoter.reset(promoter); | 105 _promoter = promoter; |
| 102 } | 106 } |
| 103 | 107 |
| 104 - (id<ContextualSearchPreloadChecker>)preloadChecker { | 108 - (id<ContextualSearchPreloadChecker>)preloadChecker { |
| 105 return _preloadChecker; | 109 return _preloadChecker; |
| 106 } | 110 } |
| 107 | 111 |
| 108 - (void)setPreloadChecker:(id<ContextualSearchPreloadChecker>)preloadChecker { | 112 - (void)setPreloadChecker:(id<ContextualSearchPreloadChecker>)preloadChecker { |
| 109 _preloadChecker.reset(preloadChecker); | 113 _preloadChecker = preloadChecker; |
| 110 } | 114 } |
| 111 | 115 |
| 112 - (BOOL)contentVisible { | 116 - (BOOL)contentVisible { |
| 113 return _loaded && _visibility == VISIBLE; | 117 return _loaded && _visibility == VISIBLE; |
| 114 } | 118 } |
| 115 | 119 |
| 116 - (void)setActive:(BOOL)active { | 120 - (void)setActive:(BOOL)active { |
| 117 if (active) { | 121 if (active) { |
| 118 if (_webState) { | 122 if (_webState) { |
| 119 Tab* tab = LegacyTabHelper::GetTabForWebState(_webState.get()); | 123 Tab* tab = LegacyTabHelper::GetTabForWebState(_webState.get()); |
| 120 // Start watching the embedded Tab's web activity. | 124 // Start watching the embedded Tab's web activity. |
| 121 _webStateObserver->ObserveWebState(_webState.get()); | 125 _webStateObserver->ObserveWebState(_webState.get()); |
| 122 _webState->SetShouldSuppressDialogs(false); | 126 _webState->SetShouldSuppressDialogs(false); |
| 123 | 127 |
| 124 _webViewProxy.reset([[[tab webController] webViewProxy] retain]); | 128 _webViewProxy = [[tab webController] webViewProxy]; |
| 125 [[_webViewProxy scrollViewProxy] setBounces:NO]; | 129 [[_webViewProxy scrollViewProxy] setBounces:NO]; |
| 126 } | 130 } |
| 127 } else { | 131 } else { |
| 128 // Stop watching the embedded Tab's web activity. | 132 // Stop watching the embedded Tab's web activity. |
| 129 _webStateObserver->ObserveWebState(nullptr); | 133 _webStateObserver->ObserveWebState(nullptr); |
| 130 _webViewProxy.reset(nil); | 134 _webViewProxy = nil; |
| 131 } | 135 } |
| 132 | 136 |
| 133 _active = active; | 137 _active = active; |
| 134 } | 138 } |
| 135 | 139 |
| 136 #pragma mark - public methods | 140 #pragma mark - public methods |
| 137 | 141 |
| 138 - (void)scrollToTopAnimated:(BOOL)animated { | 142 - (void)scrollToTopAnimated:(BOOL)animated { |
| 139 [[_webViewProxy scrollViewProxy] setBounces:YES]; | 143 [[_webViewProxy scrollViewProxy] setBounces:YES]; |
| 140 // Scroll the search tab's view to the top. | 144 // Scroll the search tab's view to the top. |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 | 195 |
| 192 #pragma mark - private methods | 196 #pragma mark - private methods |
| 193 | 197 |
| 194 - (void)disconnectTab { | 198 - (void)disconnectTab { |
| 195 if (_webState) { | 199 if (_webState) { |
| 196 Tab* tab = LegacyTabHelper::GetTabForWebState(_webState.get()); | 200 Tab* tab = LegacyTabHelper::GetTabForWebState(_webState.get()); |
| 197 [[tab view] removeFromSuperview]; | 201 [[tab view] removeFromSuperview]; |
| 198 [[tab webController] setNativeProvider:nil]; | 202 [[tab webController] setNativeProvider:nil]; |
| 199 } | 203 } |
| 200 self.active = NO; | 204 self.active = NO; |
| 201 _webViewProxy.reset(); | 205 _webViewProxy = nil; |
| 202 } | 206 } |
| 203 | 207 |
| 204 - (void)cancelLoad { | 208 - (void)cancelLoad { |
| 205 [self disconnectTab]; | 209 [self disconnectTab]; |
| 206 _loadInProgress = NO; | 210 _loadInProgress = NO; |
| 207 _loaded = NO; | 211 _loaded = NO; |
| 208 _webState.reset(); | 212 _webState.reset(); |
| 209 } | 213 } |
| 210 | 214 |
| 211 - (void)loadPendingSearchIfPossible { | 215 - (void)loadPendingSearchIfPossible { |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 withError:error | 385 withError:error |
| 382 isPost:isPost]; | 386 isPost:isPost]; |
| 383 | 387 |
| 384 if ([errorController respondsToSelector:@selector(setScrollEnabled:)]) { | 388 if ([errorController respondsToSelector:@selector(setScrollEnabled:)]) { |
| 385 [errorController setScrollEnabled:NO]; | 389 [errorController setScrollEnabled:NO]; |
| 386 } | 390 } |
| 387 return errorController; | 391 return errorController; |
| 388 } | 392 } |
| 389 | 393 |
| 390 @end | 394 @end |
| OLD | NEW |