| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/navigation/navigation_manager_impl.h" | 5 #import "ios/web/navigation/navigation_manager_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #import "ios/web/navigation/crw_session_controller+private_constructors.h" | 12 #import "ios/web/navigation/crw_session_controller+private_constructors.h" |
| 13 #import "ios/web/navigation/crw_session_controller.h" | 13 #import "ios/web/navigation/crw_session_controller.h" |
| 14 #import "ios/web/navigation/crw_session_entry.h" | |
| 15 #import "ios/web/navigation/navigation_item_impl.h" | 14 #import "ios/web/navigation/navigation_item_impl.h" |
| 16 #import "ios/web/navigation/navigation_manager_delegate.h" | 15 #import "ios/web/navigation/navigation_manager_delegate.h" |
| 17 #include "ios/web/navigation/navigation_manager_facade_delegate.h" | 16 #include "ios/web/navigation/navigation_manager_facade_delegate.h" |
| 18 #include "ios/web/public/load_committed_details.h" | 17 #include "ios/web/public/load_committed_details.h" |
| 19 #import "ios/web/public/navigation_item.h" | 18 #import "ios/web/public/navigation_item.h" |
| 20 #import "ios/web/public/web_state/web_state.h" | 19 #import "ios/web/public/web_state/web_state.h" |
| 21 #include "ui/base/page_transition_types.h" | 20 #include "ui/base/page_transition_types.h" |
| 22 | 21 |
| 23 #if !defined(__has_feature) || !__has_feature(objc_arc) | 22 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 24 #error "This file requires ARC support." | 23 #error "This file requires ARC support." |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 if (facade_delegate_) | 138 if (facade_delegate_) |
| 140 facade_delegate_->OnNavigationItemChanged(); | 139 facade_delegate_->OnNavigationItemChanged(); |
| 141 } | 140 } |
| 142 | 141 |
| 143 void NavigationManagerImpl::OnNavigationItemCommitted() { | 142 void NavigationManagerImpl::OnNavigationItemCommitted() { |
| 144 LoadCommittedDetails details; | 143 LoadCommittedDetails details; |
| 145 details.item = GetLastCommittedItem(); | 144 details.item = GetLastCommittedItem(); |
| 146 DCHECK(details.item); | 145 DCHECK(details.item); |
| 147 details.previous_item_index = [session_controller_ previousNavigationIndex]; | 146 details.previous_item_index = [session_controller_ previousNavigationIndex]; |
| 148 if (details.previous_item_index >= 0) { | 147 if (details.previous_item_index >= 0) { |
| 149 DCHECK([session_controller_ previousEntry]); | 148 DCHECK(GetPreviousItem()); |
| 150 details.previous_url = | 149 details.previous_url = GetPreviousItem()->GetURL(); |
| 151 [session_controller_ previousEntry].navigationItem->GetURL(); | |
| 152 details.is_in_page = | 150 details.is_in_page = |
| 153 AreURLsInPageNavigation(details.previous_url, details.item->GetURL()); | 151 AreURLsInPageNavigation(details.previous_url, details.item->GetURL()); |
| 154 } else { | 152 } else { |
| 155 details.previous_url = GURL(); | 153 details.previous_url = GURL(); |
| 156 details.is_in_page = NO; | 154 details.is_in_page = NO; |
| 157 } | 155 } |
| 158 | 156 |
| 159 delegate_->OnNavigationItemCommitted(details); | 157 delegate_->OnNavigationItemCommitted(details); |
| 160 | 158 |
| 161 if (facade_delegate_) { | 159 if (facade_delegate_) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 191 bool use_desktop_user_agent = | 189 bool use_desktop_user_agent = |
| 192 override_desktop_user_agent_for_next_pending_item_ || | 190 override_desktop_user_agent_for_next_pending_item_ || |
| 193 (GetLastCommittedItem() && | 191 (GetLastCommittedItem() && |
| 194 GetLastCommittedItem()->IsOverridingUserAgent()); | 192 GetLastCommittedItem()->IsOverridingUserAgent()); |
| 195 GetPendingItem()->SetIsOverridingUserAgent(use_desktop_user_agent); | 193 GetPendingItem()->SetIsOverridingUserAgent(use_desktop_user_agent); |
| 196 override_desktop_user_agent_for_next_pending_item_ = false; | 194 override_desktop_user_agent_for_next_pending_item_ = false; |
| 197 } | 195 } |
| 198 } | 196 } |
| 199 | 197 |
| 200 NavigationItem* NavigationManagerImpl::GetLastUserItem() const { | 198 NavigationItem* NavigationManagerImpl::GetLastUserItem() const { |
| 201 CRWSessionEntry* entry = [session_controller_ lastUserEntry]; | 199 return [session_controller_ lastUserItem]; |
| 202 return [entry navigationItem]; | |
| 203 } | 200 } |
| 204 | 201 |
| 205 NavigationItem* NavigationManagerImpl::GetPreviousItem() const { | 202 NavigationItem* NavigationManagerImpl::GetPreviousItem() const { |
| 206 CRWSessionEntry* entry = [session_controller_ previousEntry]; | 203 return [session_controller_ previousItem]; |
| 207 return [entry navigationItem]; | |
| 208 } | 204 } |
| 209 | 205 |
| 210 std::vector<NavigationItem*> NavigationManagerImpl::GetItems() { | 206 NavigationItemList NavigationManagerImpl::GetItems() const { |
| 211 std::vector<NavigationItem*> items; | 207 return [session_controller_ items]; |
| 212 size_t i = 0; | |
| 213 items.resize([session_controller_ entries].count); | |
| 214 for (CRWSessionEntry* entry in [session_controller_ entries]) { | |
| 215 items[i++] = entry.navigationItem; | |
| 216 } | |
| 217 return items; | |
| 218 } | 208 } |
| 219 | 209 |
| 220 BrowserState* NavigationManagerImpl::GetBrowserState() const { | 210 BrowserState* NavigationManagerImpl::GetBrowserState() const { |
| 221 return browser_state_; | 211 return browser_state_; |
| 222 } | 212 } |
| 223 | 213 |
| 224 WebState* NavigationManagerImpl::GetWebState() const { | 214 WebState* NavigationManagerImpl::GetWebState() const { |
| 225 return delegate_->GetWebState(); | 215 return delegate_->GetWebState(); |
| 226 } | 216 } |
| 227 | 217 |
| 228 NavigationItem* NavigationManagerImpl::GetVisibleItem() const { | 218 NavigationItem* NavigationManagerImpl::GetVisibleItem() const { |
| 229 CRWSessionEntry* entry = [session_controller_ visibleEntry]; | 219 return [session_controller_ visibleItem]; |
| 230 return [entry navigationItem]; | |
| 231 } | 220 } |
| 232 | 221 |
| 233 NavigationItem* NavigationManagerImpl::GetLastCommittedItem() const { | 222 NavigationItem* NavigationManagerImpl::GetLastCommittedItem() const { |
| 234 CRWSessionEntry* entry = [session_controller_ lastCommittedEntry]; | 223 return [session_controller_ lastCommittedItem]; |
| 235 return [entry navigationItem]; | |
| 236 } | 224 } |
| 237 | 225 |
| 238 NavigationItem* NavigationManagerImpl::GetPendingItem() const { | 226 NavigationItem* NavigationManagerImpl::GetPendingItem() const { |
| 239 return [[session_controller_ pendingEntry] navigationItem]; | 227 return [session_controller_ pendingItem]; |
| 240 } | 228 } |
| 241 | 229 |
| 242 NavigationItem* NavigationManagerImpl::GetTransientItem() const { | 230 NavigationItem* NavigationManagerImpl::GetTransientItem() const { |
| 243 return [[session_controller_ transientEntry] navigationItem]; | 231 return [session_controller_ transientItem]; |
| 244 } | 232 } |
| 245 | 233 |
| 246 void NavigationManagerImpl::DiscardNonCommittedItems() { | 234 void NavigationManagerImpl::DiscardNonCommittedItems() { |
| 247 [session_controller_ discardNonCommittedItems]; | 235 [session_controller_ discardNonCommittedItems]; |
| 248 } | 236 } |
| 249 | 237 |
| 250 void NavigationManagerImpl::LoadIfNecessary() { | 238 void NavigationManagerImpl::LoadIfNecessary() { |
| 251 // Nothing to do; iOS loads lazily. | 239 // Nothing to do; iOS loads lazily. |
| 252 } | 240 } |
| 253 | 241 |
| 254 void NavigationManagerImpl::LoadURLWithParams( | 242 void NavigationManagerImpl::LoadURLWithParams( |
| 255 const NavigationManager::WebLoadParams& params) { | 243 const NavigationManager::WebLoadParams& params) { |
| 256 delegate_->LoadURLWithParams(params); | 244 delegate_->LoadURLWithParams(params); |
| 257 } | 245 } |
| 258 | 246 |
| 259 void NavigationManagerImpl::AddTransientURLRewriter( | 247 void NavigationManagerImpl::AddTransientURLRewriter( |
| 260 BrowserURLRewriter::URLRewriter rewriter) { | 248 BrowserURLRewriter::URLRewriter rewriter) { |
| 261 DCHECK(rewriter); | 249 DCHECK(rewriter); |
| 262 if (!transient_url_rewriters_) { | 250 if (!transient_url_rewriters_) { |
| 263 transient_url_rewriters_.reset( | 251 transient_url_rewriters_.reset( |
| 264 new std::vector<BrowserURLRewriter::URLRewriter>()); | 252 new std::vector<BrowserURLRewriter::URLRewriter>()); |
| 265 } | 253 } |
| 266 transient_url_rewriters_->push_back(rewriter); | 254 transient_url_rewriters_->push_back(rewriter); |
| 267 } | 255 } |
| 268 | 256 |
| 269 int NavigationManagerImpl::GetItemCount() const { | 257 int NavigationManagerImpl::GetItemCount() const { |
| 270 return [[session_controller_ entries] count]; | 258 return GetItems().size(); |
| 271 } | 259 } |
| 272 | 260 |
| 273 NavigationItem* NavigationManagerImpl::GetItemAtIndex(size_t index) const { | 261 NavigationItem* NavigationManagerImpl::GetItemAtIndex(size_t index) const { |
| 274 NSArray* entries = [session_controller_ entries]; | 262 NavigationItemList items = GetItems(); |
| 275 return index < entries.count ? [entries[index] navigationItem] : nullptr; | 263 return index < items.size() ? items[index] : nullptr; |
| 276 } | 264 } |
| 277 | 265 |
| 278 int NavigationManagerImpl::GetCurrentItemIndex() const { | 266 int NavigationManagerImpl::GetCurrentItemIndex() const { |
| 279 return [session_controller_ currentNavigationIndex]; | 267 return [session_controller_ currentNavigationIndex]; |
| 280 } | 268 } |
| 281 | 269 |
| 282 int NavigationManagerImpl::GetPendingItemIndex() const { | 270 int NavigationManagerImpl::GetPendingItemIndex() const { |
| 283 if ([session_controller_ pendingEntry]) { | 271 if (GetPendingItem()) { |
| 284 if ([session_controller_ pendingItemIndex] != -1) { | 272 if ([session_controller_ pendingItemIndex] != -1) { |
| 285 return [session_controller_ pendingItemIndex]; | 273 return [session_controller_ pendingItemIndex]; |
| 286 } | 274 } |
| 287 // TODO(crbug.com/665189): understand why current item index is | 275 // TODO(crbug.com/665189): understand why current item index is |
| 288 // returned here. | 276 // returned here. |
| 289 return GetCurrentItemIndex(); | 277 return GetCurrentItemIndex(); |
| 290 } | 278 } |
| 291 return -1; | 279 return -1; |
| 292 } | 280 } |
| 293 | 281 |
| 294 int NavigationManagerImpl::GetLastCommittedItemIndex() const { | 282 int NavigationManagerImpl::GetLastCommittedItemIndex() const { |
| 295 if (![[session_controller_ entries] count]) | 283 if (GetItems().empty()) |
| 296 return -1; | 284 return -1; |
| 297 return [session_controller_ currentNavigationIndex]; | 285 return [session_controller_ currentNavigationIndex]; |
| 298 } | 286 } |
| 299 | 287 |
| 300 bool NavigationManagerImpl::RemoveItemAtIndex(int index) { | 288 bool NavigationManagerImpl::RemoveItemAtIndex(int index) { |
| 301 if (index == GetLastCommittedItemIndex() || index == GetPendingItemIndex()) | 289 if (index == GetLastCommittedItemIndex() || index == GetPendingItemIndex()) |
| 302 return false; | 290 return false; |
| 303 | 291 |
| 304 NSUInteger idx = static_cast<NSUInteger>(index); | 292 size_t idx = static_cast<size_t>(index); |
| 305 NSArray* entries = [session_controller_ entries]; | 293 if (idx >= GetItems().size()) |
| 306 if (idx >= entries.count) | |
| 307 return false; | 294 return false; |
| 308 | 295 |
| 309 [session_controller_ removeItemAtIndex:index]; | 296 [session_controller_ removeItemAtIndex:index]; |
| 310 return true; | 297 return true; |
| 311 } | 298 } |
| 312 | 299 |
| 313 bool NavigationManagerImpl::CanGoBack() const { | 300 bool NavigationManagerImpl::CanGoBack() const { |
| 314 return CanGoToOffset(-1); | 301 return CanGoToOffset(-1); |
| 315 } | 302 } |
| 316 | 303 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 } | 415 } |
| 429 | 416 |
| 430 bool NavigationManagerImpl::IsRedirectItemAtIndex(int index) const { | 417 bool NavigationManagerImpl::IsRedirectItemAtIndex(int index) const { |
| 431 DCHECK_GT(index, 0); | 418 DCHECK_GT(index, 0); |
| 432 DCHECK_LT(index, GetItemCount()); | 419 DCHECK_LT(index, GetItemCount()); |
| 433 ui::PageTransition transition = GetItemAtIndex(index)->GetTransitionType(); | 420 ui::PageTransition transition = GetItemAtIndex(index)->GetTransitionType(); |
| 434 return transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK; | 421 return transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK; |
| 435 } | 422 } |
| 436 | 423 |
| 437 } // namespace web | 424 } // namespace web |
| OLD | NEW |