Chromium Code Reviews| 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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 136 if (facade_delegate_) | 135 if (facade_delegate_) |
| 137 facade_delegate_->OnNavigationItemChanged(); | 136 facade_delegate_->OnNavigationItemChanged(); |
| 138 } | 137 } |
| 139 | 138 |
| 140 void NavigationManagerImpl::OnNavigationItemCommitted() { | 139 void NavigationManagerImpl::OnNavigationItemCommitted() { |
| 141 LoadCommittedDetails details; | 140 LoadCommittedDetails details; |
| 142 details.item = GetLastCommittedItem(); | 141 details.item = GetLastCommittedItem(); |
| 143 DCHECK(details.item); | 142 DCHECK(details.item); |
| 144 details.previous_item_index = [session_controller_ previousNavigationIndex]; | 143 details.previous_item_index = [session_controller_ previousNavigationIndex]; |
| 145 if (details.previous_item_index >= 0) { | 144 if (details.previous_item_index >= 0) { |
| 146 DCHECK([session_controller_ previousEntry]); | 145 DCHECK(GetPreviousItem()); |
| 147 details.previous_url = | 146 details.previous_url = GetPreviousItem()->GetURL(); |
| 148 [session_controller_ previousEntry].navigationItem->GetURL(); | |
| 149 details.is_in_page = | 147 details.is_in_page = |
| 150 AreURLsInPageNavigation(details.previous_url, details.item->GetURL()); | 148 AreURLsInPageNavigation(details.previous_url, details.item->GetURL()); |
| 151 } else { | 149 } else { |
| 152 details.previous_url = GURL(); | 150 details.previous_url = GURL(); |
| 153 details.is_in_page = NO; | 151 details.is_in_page = NO; |
| 154 } | 152 } |
| 155 | 153 |
| 156 delegate_->OnNavigationItemCommitted(details); | 154 delegate_->OnNavigationItemCommitted(details); |
| 157 | 155 |
| 158 if (facade_delegate_) { | 156 if (facade_delegate_) { |
| 159 facade_delegate_->OnNavigationItemCommitted(details.previous_item_index, | 157 facade_delegate_->OnNavigationItemCommitted(details.previous_item_index, |
| 160 details.is_in_page); | 158 details.is_in_page); |
| 161 } | 159 } |
| 162 } | 160 } |
| 163 | 161 |
| 164 CRWSessionController* NavigationManagerImpl::GetSessionController() { | 162 CRWSessionController* NavigationManagerImpl::GetSessionController() { |
| 165 return session_controller_; | 163 return session_controller_; |
| 166 } | 164 } |
| 167 | 165 |
| 168 void NavigationManagerImpl::LoadURL(const GURL& url, | 166 void NavigationManagerImpl::LoadURL(const GURL& url, |
| 169 const web::Referrer& referrer, | 167 const web::Referrer& referrer, |
| 170 ui::PageTransition type) { | 168 ui::PageTransition type) { |
| 171 WebState::OpenURLParams params(url, referrer, | 169 WebState::OpenURLParams params(url, referrer, |
| 172 WindowOpenDisposition::CURRENT_TAB, type, NO); | 170 WindowOpenDisposition::CURRENT_TAB, type, NO); |
| 173 delegate_->GetWebState()->OpenURL(params); | 171 delegate_->GetWebState()->OpenURL(params); |
| 174 } | 172 } |
| 175 | 173 |
| 176 NavigationItem* NavigationManagerImpl::GetLastUserItem() const { | 174 NavigationItem* NavigationManagerImpl::GetLastUserItem() const { |
| 177 CRWSessionEntry* entry = [session_controller_ lastUserEntry]; | 175 return [session_controller_ lastUserItem]; |
| 178 return [entry navigationItem]; | |
| 179 } | 176 } |
| 180 | 177 |
| 181 NavigationItem* NavigationManagerImpl::GetPreviousItem() const { | 178 NavigationItem* NavigationManagerImpl::GetPreviousItem() const { |
| 182 CRWSessionEntry* entry = [session_controller_ previousEntry]; | 179 return [session_controller_ previousItem]; |
| 183 return [entry navigationItem]; | |
| 184 } | 180 } |
| 185 | 181 |
| 186 std::vector<NavigationItem*> NavigationManagerImpl::GetItems() { | 182 NavigationItemList NavigationManagerImpl::GetItems() const { |
| 187 std::vector<NavigationItem*> items; | 183 return [session_controller_ items]; |
| 188 size_t i = 0; | |
| 189 items.resize([session_controller_ entries].count); | |
| 190 for (CRWSessionEntry* entry in [session_controller_ entries]) { | |
| 191 items[i++] = entry.navigationItem; | |
| 192 } | |
| 193 return items; | |
| 194 } | 184 } |
| 195 | 185 |
| 196 BrowserState* NavigationManagerImpl::GetBrowserState() const { | 186 BrowserState* NavigationManagerImpl::GetBrowserState() const { |
| 197 return browser_state_; | 187 return browser_state_; |
| 198 } | 188 } |
| 199 | 189 |
| 200 WebState* NavigationManagerImpl::GetWebState() const { | 190 WebState* NavigationManagerImpl::GetWebState() const { |
| 201 return delegate_->GetWebState(); | 191 return delegate_->GetWebState(); |
| 202 } | 192 } |
| 203 | 193 |
| 204 NavigationItem* NavigationManagerImpl::GetVisibleItem() const { | 194 NavigationItem* NavigationManagerImpl::GetVisibleItem() const { |
| 205 CRWSessionEntry* entry = [session_controller_ visibleEntry]; | 195 return [session_controller_ visibleItem]; |
| 206 return [entry navigationItem]; | |
| 207 } | 196 } |
| 208 | 197 |
| 209 NavigationItem* NavigationManagerImpl::GetLastCommittedItem() const { | 198 NavigationItem* NavigationManagerImpl::GetLastCommittedItem() const { |
| 210 CRWSessionEntry* entry = [session_controller_ lastCommittedEntry]; | 199 return [session_controller_ lastCommittedItem]; |
| 211 return [entry navigationItem]; | |
| 212 } | 200 } |
| 213 | 201 |
| 214 NavigationItem* NavigationManagerImpl::GetPendingItem() const { | 202 NavigationItem* NavigationManagerImpl::GetPendingItem() const { |
| 215 return [[session_controller_ pendingEntry] navigationItem]; | 203 return [session_controller_ pendingItem]; |
| 216 } | 204 } |
| 217 | 205 |
| 218 NavigationItem* NavigationManagerImpl::GetTransientItem() const { | 206 NavigationItem* NavigationManagerImpl::GetTransientItem() const { |
| 219 return [[session_controller_ transientEntry] navigationItem]; | 207 return [session_controller_ transientItem]; |
| 220 } | 208 } |
| 221 | 209 |
| 222 void NavigationManagerImpl::DiscardNonCommittedItems() { | 210 void NavigationManagerImpl::DiscardNonCommittedItems() { |
| 223 [session_controller_ discardNonCommittedItems]; | 211 [session_controller_ discardNonCommittedItems]; |
| 224 } | 212 } |
| 225 | 213 |
| 226 void NavigationManagerImpl::LoadIfNecessary() { | 214 void NavigationManagerImpl::LoadIfNecessary() { |
| 227 // Nothing to do; iOS loads lazily. | 215 // Nothing to do; iOS loads lazily. |
| 228 } | 216 } |
| 229 | 217 |
| 230 void NavigationManagerImpl::LoadURLWithParams( | 218 void NavigationManagerImpl::LoadURLWithParams( |
| 231 const NavigationManager::WebLoadParams& params) { | 219 const NavigationManager::WebLoadParams& params) { |
| 232 delegate_->LoadURLWithParams(params); | 220 delegate_->LoadURLWithParams(params); |
| 233 } | 221 } |
| 234 | 222 |
| 235 void NavigationManagerImpl::AddTransientURLRewriter( | 223 void NavigationManagerImpl::AddTransientURLRewriter( |
| 236 BrowserURLRewriter::URLRewriter rewriter) { | 224 BrowserURLRewriter::URLRewriter rewriter) { |
| 237 DCHECK(rewriter); | 225 DCHECK(rewriter); |
| 238 if (!transient_url_rewriters_) { | 226 if (!transient_url_rewriters_) { |
| 239 transient_url_rewriters_.reset( | 227 transient_url_rewriters_.reset( |
| 240 new std::vector<BrowserURLRewriter::URLRewriter>()); | 228 new std::vector<BrowserURLRewriter::URLRewriter>()); |
| 241 } | 229 } |
| 242 transient_url_rewriters_->push_back(rewriter); | 230 transient_url_rewriters_->push_back(rewriter); |
| 243 } | 231 } |
| 244 | 232 |
| 245 int NavigationManagerImpl::GetItemCount() const { | 233 int NavigationManagerImpl::GetItemCount() const { |
| 246 return [[session_controller_ entries] count]; | 234 return GetItems().size(); |
| 247 } | 235 } |
| 248 | 236 |
| 249 NavigationItem* NavigationManagerImpl::GetItemAtIndex(size_t index) const { | 237 NavigationItem* NavigationManagerImpl::GetItemAtIndex(size_t index) const { |
| 250 NSArray* entries = [session_controller_ entries]; | 238 NavigationItemList items = GetItems(); |
| 251 return index < entries.count ? [entries[index] navigationItem] : nullptr; | 239 return index < items.size() ? items[index] : nullptr; |
| 252 } | 240 } |
| 253 | 241 |
| 254 int NavigationManagerImpl::GetCurrentItemIndex() const { | 242 int NavigationManagerImpl::GetCurrentItemIndex() const { |
| 255 return [session_controller_ currentNavigationIndex]; | 243 return [session_controller_ currentNavigationIndex]; |
| 256 } | 244 } |
| 257 | 245 |
| 258 int NavigationManagerImpl::GetPendingItemIndex() const { | 246 int NavigationManagerImpl::GetPendingItemIndex() const { |
| 259 if ([session_controller_ pendingEntry]) { | 247 if (GetPendingItem()) { |
| 260 if ([session_controller_ pendingItemIndex] != -1) { | 248 if ([session_controller_ pendingItemIndex] != -1) { |
| 261 return [session_controller_ pendingItemIndex]; | 249 return [session_controller_ pendingItemIndex]; |
| 262 } | 250 } |
| 263 // TODO(crbug.com/665189): understand why current item index is | 251 // TODO(crbug.com/665189): understand why current item index is |
| 264 // returned here. | 252 // returned here. |
| 265 return GetCurrentItemIndex(); | 253 return GetCurrentItemIndex(); |
| 266 } | 254 } |
| 267 return -1; | 255 return -1; |
| 268 } | 256 } |
| 269 | 257 |
| 270 int NavigationManagerImpl::GetLastCommittedItemIndex() const { | 258 int NavigationManagerImpl::GetLastCommittedItemIndex() const { |
| 271 if (![[session_controller_ entries] count]) | 259 if (GetItems().empty()) |
| 272 return -1; | 260 return -1; |
| 273 return [session_controller_ currentNavigationIndex]; | 261 return [session_controller_ currentNavigationIndex]; |
| 274 } | 262 } |
| 275 | 263 |
| 276 bool NavigationManagerImpl::RemoveItemAtIndex(int index) { | 264 bool NavigationManagerImpl::RemoveItemAtIndex(int index) { |
| 277 if (index == GetLastCommittedItemIndex() || index == GetPendingItemIndex()) | 265 if (index == GetLastCommittedItemIndex() || index == GetPendingItemIndex()) |
| 278 return false; | 266 return false; |
| 279 | 267 |
| 280 NSUInteger idx = static_cast<NSUInteger>(index); | 268 size_t idx = static_cast<size_t>(index); |
| 281 NSArray* entries = [session_controller_ entries]; | 269 if (idx >= GetItems().size()) |
|
Eugene But (OOO till 7-30)
2017/02/18 01:21:38
Do you want to file a bug and add a TODO to change
kkhorimoto
2017/02/23 05:22:31
One was already created; I've added TODOs in navig
| |
| 282 if (idx >= entries.count) | |
| 283 return false; | 270 return false; |
| 284 | 271 |
| 285 [session_controller_ removeItemAtIndex:index]; | 272 [session_controller_ removeItemAtIndex:index]; |
| 286 return true; | 273 return true; |
| 287 } | 274 } |
| 288 | 275 |
| 289 bool NavigationManagerImpl::CanGoBack() const { | 276 bool NavigationManagerImpl::CanGoBack() const { |
| 290 return CanGoToOffset(-1); | 277 return CanGoToOffset(-1); |
| 291 } | 278 } |
| 292 | 279 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 397 } | 384 } |
| 398 | 385 |
| 399 bool NavigationManagerImpl::IsRedirectItemAtIndex(int index) const { | 386 bool NavigationManagerImpl::IsRedirectItemAtIndex(int index) const { |
| 400 DCHECK_GT(index, 0); | 387 DCHECK_GT(index, 0); |
| 401 DCHECK_LT(index, GetItemCount()); | 388 DCHECK_LT(index, GetItemCount()); |
| 402 ui::PageTransition transition = GetItemAtIndex(index)->GetTransitionType(); | 389 ui::PageTransition transition = GetItemAtIndex(index)->GetTransitionType(); |
| 403 return transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK; | 390 return transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK; |
| 404 } | 391 } |
| 405 | 392 |
| 406 } // namespace web | 393 } // namespace web |
| OLD | NEW |