| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "content/browser/tab_contents/navigation_controller.h" | 5 #include "content/browser/tab_contents/navigation_controller.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/time.h" | 10 #include "base/time.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 } | 63 } |
| 64 | 64 |
| 65 // Configure all the NavigationEntries in entries for restore. This resets | 65 // Configure all the NavigationEntries in entries for restore. This resets |
| 66 // the transition type to reload and makes sure the content state isn't empty. | 66 // the transition type to reload and makes sure the content state isn't empty. |
| 67 void ConfigureEntriesForRestore( | 67 void ConfigureEntriesForRestore( |
| 68 std::vector<linked_ptr<NavigationEntry> >* entries, | 68 std::vector<linked_ptr<NavigationEntry> >* entries, |
| 69 bool from_last_session) { | 69 bool from_last_session) { |
| 70 for (size_t i = 0; i < entries->size(); ++i) { | 70 for (size_t i = 0; i < entries->size(); ++i) { |
| 71 // Use a transition type of reload so that we don't incorrectly increase | 71 // Use a transition type of reload so that we don't incorrectly increase |
| 72 // the typed count. | 72 // the typed count. |
| 73 (*entries)[i]->set_transition_type(PageTransition::RELOAD); | 73 (*entries)[i]->set_transition_type(content::PAGE_TRANSITION_RELOAD); |
| 74 (*entries)[i]->set_restore_type(from_last_session ? | 74 (*entries)[i]->set_restore_type(from_last_session ? |
| 75 NavigationEntry::RESTORE_LAST_SESSION : | 75 NavigationEntry::RESTORE_LAST_SESSION : |
| 76 NavigationEntry::RESTORE_CURRENT_SESSION); | 76 NavigationEntry::RESTORE_CURRENT_SESSION); |
| 77 // NOTE(darin): This code is only needed for backwards compat. | 77 // NOTE(darin): This code is only needed for backwards compat. |
| 78 SetContentStateIfEmpty((*entries)[i].get()); | 78 SetContentStateIfEmpty((*entries)[i].get()); |
| 79 } | 79 } |
| 80 } | 80 } |
| 81 | 81 |
| 82 // See NavigationController::IsURLInPageNavigation for how this works and why. | 82 // See NavigationController::IsURLInPageNavigation for how this works and why. |
| 83 bool AreURLsInPageNavigation(const GURL& existing_url, const GURL& new_url) { | 83 bool AreURLsInPageNavigation(const GURL& existing_url, const GURL& new_url) { |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 Source<NavigationController>(this), | 188 Source<NavigationController>(this), |
| 189 NotificationService::NoDetails()); | 189 NotificationService::NoDetails()); |
| 190 | 190 |
| 191 pending_reload_ = reload_type; | 191 pending_reload_ = reload_type; |
| 192 tab_contents_->Activate(); | 192 tab_contents_->Activate(); |
| 193 tab_contents_->delegate()->ShowRepostFormWarningDialog(tab_contents_); | 193 tab_contents_->delegate()->ShowRepostFormWarningDialog(tab_contents_); |
| 194 } else { | 194 } else { |
| 195 DiscardNonCommittedEntriesInternal(); | 195 DiscardNonCommittedEntriesInternal(); |
| 196 | 196 |
| 197 pending_entry_index_ = current_index; | 197 pending_entry_index_ = current_index; |
| 198 entries_[pending_entry_index_]->set_transition_type(PageTransition::RELOAD); | 198 entries_[pending_entry_index_]->set_transition_type( |
| 199 content::PAGE_TRANSITION_RELOAD); |
| 199 NavigateToPendingEntry(reload_type); | 200 NavigateToPendingEntry(reload_type); |
| 200 } | 201 } |
| 201 } | 202 } |
| 202 | 203 |
| 203 void NavigationController::CancelPendingReload() { | 204 void NavigationController::CancelPendingReload() { |
| 204 DCHECK(pending_reload_ != NO_RELOAD); | 205 DCHECK(pending_reload_ != NO_RELOAD); |
| 205 pending_reload_ = NO_RELOAD; | 206 pending_reload_ = NO_RELOAD; |
| 206 } | 207 } |
| 207 | 208 |
| 208 void NavigationController::ContinuePendingReload() { | 209 void NavigationController::ContinuePendingReload() { |
| 209 if (pending_reload_ == NO_RELOAD) { | 210 if (pending_reload_ == NO_RELOAD) { |
| 210 NOTREACHED(); | 211 NOTREACHED(); |
| 211 } else { | 212 } else { |
| 212 ReloadInternal(false, pending_reload_); | 213 ReloadInternal(false, pending_reload_); |
| 213 pending_reload_ = NO_RELOAD; | 214 pending_reload_ = NO_RELOAD; |
| 214 } | 215 } |
| 215 } | 216 } |
| 216 | 217 |
| 217 bool NavigationController::IsInitialNavigation() { | 218 bool NavigationController::IsInitialNavigation() { |
| 218 return last_document_loaded_.is_null(); | 219 return last_document_loaded_.is_null(); |
| 219 } | 220 } |
| 220 | 221 |
| 221 // static | 222 // static |
| 222 NavigationEntry* NavigationController::CreateNavigationEntry( | 223 NavigationEntry* NavigationController::CreateNavigationEntry( |
| 223 const GURL& url, const GURL& referrer, PageTransition::Type transition, | 224 const GURL& url, const GURL& referrer, content::PageTransition transition, |
| 224 const std::string& extra_headers, | 225 const std::string& extra_headers, |
| 225 content::BrowserContext* browser_context) { | 226 content::BrowserContext* browser_context) { |
| 226 // Allow the browser URL handler to rewrite the URL. This will, for example, | 227 // Allow the browser URL handler to rewrite the URL. This will, for example, |
| 227 // remove "view-source:" from the beginning of the URL to get the URL that | 228 // remove "view-source:" from the beginning of the URL to get the URL that |
| 228 // will actually be loaded. This real URL won't be shown to the user, just | 229 // will actually be loaded. This real URL won't be shown to the user, just |
| 229 // used internally. | 230 // used internally. |
| 230 GURL loaded_url(url); | 231 GURL loaded_url(url); |
| 231 bool reverse_on_redirect = false; | 232 bool reverse_on_redirect = false; |
| 232 BrowserURLHandler::GetInstance()->RewriteURLIfNecessary( | 233 BrowserURLHandler::GetInstance()->RewriteURLIfNecessary( |
| 233 &loaded_url, browser_context, &reverse_on_redirect); | 234 &loaded_url, browser_context, &reverse_on_redirect); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 return; | 351 return; |
| 351 } | 352 } |
| 352 | 353 |
| 353 // Base the navigation on where we are now... | 354 // Base the navigation on where we are now... |
| 354 int current_index = GetCurrentEntryIndex(); | 355 int current_index = GetCurrentEntryIndex(); |
| 355 | 356 |
| 356 DiscardNonCommittedEntries(); | 357 DiscardNonCommittedEntries(); |
| 357 | 358 |
| 358 pending_entry_index_ = current_index - 1; | 359 pending_entry_index_ = current_index - 1; |
| 359 entries_[pending_entry_index_]->set_transition_type( | 360 entries_[pending_entry_index_]->set_transition_type( |
| 360 entries_[pending_entry_index_]->transition_type() | | 361 content::PageTransitionFromInt( |
| 361 PageTransition::FORWARD_BACK); | 362 entries_[pending_entry_index_]->transition_type() | |
| 363 content::PAGE_TRANSITION_FORWARD_BACK)); |
| 362 NavigateToPendingEntry(NO_RELOAD); | 364 NavigateToPendingEntry(NO_RELOAD); |
| 363 } | 365 } |
| 364 | 366 |
| 365 void NavigationController::GoForward() { | 367 void NavigationController::GoForward() { |
| 366 if (!CanGoForward()) { | 368 if (!CanGoForward()) { |
| 367 NOTREACHED(); | 369 NOTREACHED(); |
| 368 return; | 370 return; |
| 369 } | 371 } |
| 370 | 372 |
| 371 // If an interstitial page is showing, the previous renderer is blocked and | 373 // If an interstitial page is showing, the previous renderer is blocked and |
| (...skipping 11 matching lines...) Expand all Loading... |
| 383 | 385 |
| 384 DiscardNonCommittedEntries(); | 386 DiscardNonCommittedEntries(); |
| 385 | 387 |
| 386 pending_entry_index_ = current_index; | 388 pending_entry_index_ = current_index; |
| 387 // If there was a transient entry, we removed it making the current index | 389 // If there was a transient entry, we removed it making the current index |
| 388 // the next page. | 390 // the next page. |
| 389 if (!transient) | 391 if (!transient) |
| 390 pending_entry_index_++; | 392 pending_entry_index_++; |
| 391 | 393 |
| 392 entries_[pending_entry_index_]->set_transition_type( | 394 entries_[pending_entry_index_]->set_transition_type( |
| 393 entries_[pending_entry_index_]->transition_type() | | 395 content::PageTransitionFromInt( |
| 394 PageTransition::FORWARD_BACK); | 396 entries_[pending_entry_index_]->transition_type() | |
| 397 content::PAGE_TRANSITION_FORWARD_BACK)); |
| 395 NavigateToPendingEntry(NO_RELOAD); | 398 NavigateToPendingEntry(NO_RELOAD); |
| 396 } | 399 } |
| 397 | 400 |
| 398 void NavigationController::GoToIndex(int index) { | 401 void NavigationController::GoToIndex(int index) { |
| 399 if (index < 0 || index >= static_cast<int>(entries_.size())) { | 402 if (index < 0 || index >= static_cast<int>(entries_.size())) { |
| 400 NOTREACHED(); | 403 NOTREACHED(); |
| 401 return; | 404 return; |
| 402 } | 405 } |
| 403 | 406 |
| 404 if (transient_entry_index_ != -1) { | 407 if (transient_entry_index_ != -1) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 424 // navigation to succeed. The interstitial will stay visible until the | 427 // navigation to succeed. The interstitial will stay visible until the |
| 425 // resulting DidNavigate. | 428 // resulting DidNavigate. |
| 426 tab_contents_->interstitial_page()->CancelForNavigation(); | 429 tab_contents_->interstitial_page()->CancelForNavigation(); |
| 427 } | 430 } |
| 428 } | 431 } |
| 429 | 432 |
| 430 DiscardNonCommittedEntries(); | 433 DiscardNonCommittedEntries(); |
| 431 | 434 |
| 432 pending_entry_index_ = index; | 435 pending_entry_index_ = index; |
| 433 entries_[pending_entry_index_]->set_transition_type( | 436 entries_[pending_entry_index_]->set_transition_type( |
| 434 entries_[pending_entry_index_]->transition_type() | | 437 content::PageTransitionFromInt( |
| 435 PageTransition::FORWARD_BACK); | 438 entries_[pending_entry_index_]->transition_type() | |
| 439 content::PAGE_TRANSITION_FORWARD_BACK)); |
| 436 NavigateToPendingEntry(NO_RELOAD); | 440 NavigateToPendingEntry(NO_RELOAD); |
| 437 } | 441 } |
| 438 | 442 |
| 439 void NavigationController::GoToOffset(int offset) { | 443 void NavigationController::GoToOffset(int offset) { |
| 440 int index = (transient_entry_index_ != -1) ? | 444 int index = (transient_entry_index_ != -1) ? |
| 441 transient_entry_index_ + offset : | 445 transient_entry_index_ + offset : |
| 442 last_committed_entry_index_ + offset; | 446 last_committed_entry_index_ + offset; |
| 443 if (index < 0 || index >= entry_count()) | 447 if (index < 0 || index >= entry_count()) |
| 444 return; | 448 return; |
| 445 | 449 |
| 446 GoToIndex(index); | 450 GoToIndex(index); |
| 447 } | 451 } |
| 448 | 452 |
| 449 void NavigationController::RemoveEntryAtIndex(int index, | 453 void NavigationController::RemoveEntryAtIndex(int index, |
| 450 const GURL& default_url) { | 454 const GURL& default_url) { |
| 451 bool is_current = index == last_committed_entry_index_; | 455 bool is_current = index == last_committed_entry_index_; |
| 452 RemoveEntryAtIndexInternal(index); | 456 RemoveEntryAtIndexInternal(index); |
| 453 if (is_current) { | 457 if (is_current) { |
| 454 // We removed the currently shown entry, so we have to load something else. | 458 // We removed the currently shown entry, so we have to load something else. |
| 455 if (last_committed_entry_index_ != -1) { | 459 if (last_committed_entry_index_ != -1) { |
| 456 pending_entry_index_ = last_committed_entry_index_; | 460 pending_entry_index_ = last_committed_entry_index_; |
| 457 NavigateToPendingEntry(NO_RELOAD); | 461 NavigateToPendingEntry(NO_RELOAD); |
| 458 } else { | 462 } else { |
| 459 // If there is nothing to show, show a default page. | 463 // If there is nothing to show, show a default page. |
| 460 LoadURL(default_url.is_empty() ? GURL("about:blank") : default_url, | 464 LoadURL(default_url.is_empty() ? GURL("about:blank") : default_url, |
| 461 GURL(), PageTransition::START_PAGE, std::string()); | 465 GURL(), content::PAGE_TRANSITION_START_PAGE, std::string()); |
| 462 } | 466 } |
| 463 } | 467 } |
| 464 } | 468 } |
| 465 | 469 |
| 466 void NavigationController::UpdateVirtualURLToURL( | 470 void NavigationController::UpdateVirtualURLToURL( |
| 467 NavigationEntry* entry, const GURL& new_url) { | 471 NavigationEntry* entry, const GURL& new_url) { |
| 468 GURL new_virtual_url(new_url); | 472 GURL new_virtual_url(new_url); |
| 469 if (BrowserURLHandler::GetInstance()->ReverseURLRewrite( | 473 if (BrowserURLHandler::GetInstance()->ReverseURLRewrite( |
| 470 &new_virtual_url, entry->virtual_url(), browser_context_)) { | 474 &new_virtual_url, entry->virtual_url(), browser_context_)) { |
| 471 entry->set_virtual_url(new_virtual_url); | 475 entry->set_virtual_url(new_virtual_url); |
| 472 } | 476 } |
| 473 } | 477 } |
| 474 | 478 |
| 475 void NavigationController::AddTransientEntry(NavigationEntry* entry) { | 479 void NavigationController::AddTransientEntry(NavigationEntry* entry) { |
| 476 // Discard any current transient entry, we can only have one at a time. | 480 // Discard any current transient entry, we can only have one at a time. |
| 477 int index = 0; | 481 int index = 0; |
| 478 if (last_committed_entry_index_ != -1) | 482 if (last_committed_entry_index_ != -1) |
| 479 index = last_committed_entry_index_ + 1; | 483 index = last_committed_entry_index_ + 1; |
| 480 DiscardTransientEntry(); | 484 DiscardTransientEntry(); |
| 481 entries_.insert(entries_.begin() + index, linked_ptr<NavigationEntry>(entry)); | 485 entries_.insert(entries_.begin() + index, linked_ptr<NavigationEntry>(entry)); |
| 482 transient_entry_index_ = index; | 486 transient_entry_index_ = index; |
| 483 tab_contents_->NotifyNavigationStateChanged(kInvalidateAll); | 487 tab_contents_->NotifyNavigationStateChanged(kInvalidateAll); |
| 484 } | 488 } |
| 485 | 489 |
| 486 void NavigationController::LoadURL( | 490 void NavigationController::LoadURL( |
| 487 const GURL& url, | 491 const GURL& url, |
| 488 const GURL& referrer, | 492 const GURL& referrer, |
| 489 PageTransition::Type transition, | 493 content::PageTransition transition, |
| 490 const std::string& extra_headers) { | 494 const std::string& extra_headers) { |
| 491 // The user initiated a load, we don't need to reload anymore. | 495 // The user initiated a load, we don't need to reload anymore. |
| 492 needs_reload_ = false; | 496 needs_reload_ = false; |
| 493 | 497 |
| 494 NavigationEntry* entry = CreateNavigationEntry(url, referrer, transition, | 498 NavigationEntry* entry = CreateNavigationEntry(url, referrer, transition, |
| 495 extra_headers, | 499 extra_headers, |
| 496 browser_context_); | 500 browser_context_); |
| 497 | 501 |
| 498 LoadEntry(entry); | 502 LoadEntry(entry); |
| 499 } | 503 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 // get confused when we go back to them (see the function for details). | 569 // get confused when we go back to them (see the function for details). |
| 566 DCHECK(!params.content_state.empty()); | 570 DCHECK(!params.content_state.empty()); |
| 567 NavigationEntry* active_entry = GetActiveEntry(); | 571 NavigationEntry* active_entry = GetActiveEntry(); |
| 568 active_entry->set_content_state(params.content_state); | 572 active_entry->set_content_state(params.content_state); |
| 569 | 573 |
| 570 // The active entry's SiteInstance should match our SiteInstance. | 574 // The active entry's SiteInstance should match our SiteInstance. |
| 571 DCHECK(active_entry->site_instance() == tab_contents_->GetSiteInstance()); | 575 DCHECK(active_entry->site_instance() == tab_contents_->GetSiteInstance()); |
| 572 | 576 |
| 573 // Now prep the rest of the details for the notification and broadcast. | 577 // Now prep the rest of the details for the notification and broadcast. |
| 574 details->entry = active_entry; | 578 details->entry = active_entry; |
| 575 details->is_main_frame = PageTransition::IsMainFrame(params.transition); | 579 details->is_main_frame = |
| 580 content::PageTransitionIsMainFrame(params.transition); |
| 576 details->serialized_security_info = params.security_info; | 581 details->serialized_security_info = params.security_info; |
| 577 details->http_status_code = params.http_status_code; | 582 details->http_status_code = params.http_status_code; |
| 578 NotifyNavigationEntryCommitted(details); | 583 NotifyNavigationEntryCommitted(details); |
| 579 | 584 |
| 580 return true; | 585 return true; |
| 581 } | 586 } |
| 582 | 587 |
| 583 NavigationType::Type NavigationController::ClassifyNavigation( | 588 NavigationType::Type NavigationController::ClassifyNavigation( |
| 584 const ViewHostMsg_FrameNavigate_Params& params) const { | 589 const ViewHostMsg_FrameNavigate_Params& params) const { |
| 585 if (params.page_id == -1) { | 590 if (params.page_id == -1) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 601 // list. | 606 // list. |
| 602 // | 607 // |
| 603 // In these cases, there's nothing we can do with them, so ignore. | 608 // In these cases, there's nothing we can do with them, so ignore. |
| 604 return NavigationType::NAV_IGNORE; | 609 return NavigationType::NAV_IGNORE; |
| 605 } | 610 } |
| 606 | 611 |
| 607 if (params.page_id > tab_contents_->GetMaxPageID()) { | 612 if (params.page_id > tab_contents_->GetMaxPageID()) { |
| 608 // Greater page IDs than we've ever seen before are new pages. We may or may | 613 // Greater page IDs than we've ever seen before are new pages. We may or may |
| 609 // not have a pending entry for the page, and this may or may not be the | 614 // not have a pending entry for the page, and this may or may not be the |
| 610 // main frame. | 615 // main frame. |
| 611 if (PageTransition::IsMainFrame(params.transition)) | 616 if (content::PageTransitionIsMainFrame(params.transition)) |
| 612 return NavigationType::NEW_PAGE; | 617 return NavigationType::NEW_PAGE; |
| 613 | 618 |
| 614 // When this is a new subframe navigation, we should have a committed page | 619 // When this is a new subframe navigation, we should have a committed page |
| 615 // for which it's a suframe in. This may not be the case when an iframe is | 620 // for which it's a suframe in. This may not be the case when an iframe is |
| 616 // navigated on a popup navigated to about:blank (the iframe would be | 621 // navigated on a popup navigated to about:blank (the iframe would be |
| 617 // written into the popup by script on the main page). For these cases, | 622 // written into the popup by script on the main page). For these cases, |
| 618 // there isn't any navigation stuff we can do, so just ignore it. | 623 // there isn't any navigation stuff we can do, so just ignore it. |
| 619 if (!GetLastCommittedEntry()) | 624 if (!GetLastCommittedEntry()) |
| 620 return NavigationType::NAV_IGNORE; | 625 return NavigationType::NAV_IGNORE; |
| 621 | 626 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 636 // Because the unknown entry has committed, we risk showing the wrong URL in | 641 // Because the unknown entry has committed, we risk showing the wrong URL in |
| 637 // release builds. Instead, we'll kill the renderer process to be safe. | 642 // release builds. Instead, we'll kill the renderer process to be safe. |
| 638 LOG(ERROR) << "terminating renderer for bad navigation: " << params.url; | 643 LOG(ERROR) << "terminating renderer for bad navigation: " << params.url; |
| 639 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_NC")); | 644 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_NC")); |
| 640 if (tab_contents_->GetSiteInstance()->HasProcess()) | 645 if (tab_contents_->GetSiteInstance()->HasProcess()) |
| 641 tab_contents_->GetSiteInstance()->GetProcess()->ReceivedBadMessage(); | 646 tab_contents_->GetSiteInstance()->GetProcess()->ReceivedBadMessage(); |
| 642 return NavigationType::NAV_IGNORE; | 647 return NavigationType::NAV_IGNORE; |
| 643 } | 648 } |
| 644 NavigationEntry* existing_entry = entries_[existing_entry_index].get(); | 649 NavigationEntry* existing_entry = entries_[existing_entry_index].get(); |
| 645 | 650 |
| 646 if (!PageTransition::IsMainFrame(params.transition)) { | 651 if (!content::PageTransitionIsMainFrame(params.transition)) { |
| 647 // All manual subframes would get new IDs and were handled above, so we | 652 // All manual subframes would get new IDs and were handled above, so we |
| 648 // know this is auto. Since the current page was found in the navigation | 653 // know this is auto. Since the current page was found in the navigation |
| 649 // entry list, we're guaranteed to have a last committed entry. | 654 // entry list, we're guaranteed to have a last committed entry. |
| 650 DCHECK(GetLastCommittedEntry()); | 655 DCHECK(GetLastCommittedEntry()); |
| 651 return NavigationType::AUTO_SUBFRAME; | 656 return NavigationType::AUTO_SUBFRAME; |
| 652 } | 657 } |
| 653 | 658 |
| 654 // Anything below here we know is a main frame navigation. | 659 // Anything below here we know is a main frame navigation. |
| 655 if (pending_entry_ && | 660 if (pending_entry_ && |
| 656 existing_entry != pending_entry_ && | 661 existing_entry != pending_entry_ && |
| (...skipping 19 matching lines...) Expand all Loading... |
| 676 | 681 |
| 677 // Since we weeded out "new" navigations above, we know this is an existing | 682 // Since we weeded out "new" navigations above, we know this is an existing |
| 678 // (back/forward) navigation. | 683 // (back/forward) navigation. |
| 679 return NavigationType::EXISTING_PAGE; | 684 return NavigationType::EXISTING_PAGE; |
| 680 } | 685 } |
| 681 | 686 |
| 682 bool NavigationController::IsRedirect( | 687 bool NavigationController::IsRedirect( |
| 683 const ViewHostMsg_FrameNavigate_Params& params) { | 688 const ViewHostMsg_FrameNavigate_Params& params) { |
| 684 // For main frame transition, we judge by params.transition. | 689 // For main frame transition, we judge by params.transition. |
| 685 // Otherwise, by params.redirects. | 690 // Otherwise, by params.redirects. |
| 686 if (PageTransition::IsMainFrame(params.transition)) { | 691 if (content::PageTransitionIsMainFrame(params.transition)) { |
| 687 return PageTransition::IsRedirect(params.transition); | 692 return content::PageTransitionIsRedirect(params.transition); |
| 688 } | 693 } |
| 689 return params.redirects.size() > 1; | 694 return params.redirects.size() > 1; |
| 690 } | 695 } |
| 691 | 696 |
| 692 void NavigationController::RendererDidNavigateToNewPage( | 697 void NavigationController::RendererDidNavigateToNewPage( |
| 693 const ViewHostMsg_FrameNavigate_Params& params, bool* did_replace_entry) { | 698 const ViewHostMsg_FrameNavigate_Params& params, bool* did_replace_entry) { |
| 694 NavigationEntry* new_entry; | 699 NavigationEntry* new_entry; |
| 695 bool update_virtual_url; | 700 bool update_virtual_url; |
| 696 if (pending_entry_) { | 701 if (pending_entry_) { |
| 697 // TODO(brettw) this assumes that the pending entry is appropriate for the | 702 // TODO(brettw) this assumes that the pending entry is appropriate for the |
| (...skipping 23 matching lines...) Expand all Loading... |
| 721 new_entry->set_transition_type(params.transition); | 726 new_entry->set_transition_type(params.transition); |
| 722 new_entry->set_site_instance(tab_contents_->GetSiteInstance()); | 727 new_entry->set_site_instance(tab_contents_->GetSiteInstance()); |
| 723 new_entry->set_has_post_data(params.is_post); | 728 new_entry->set_has_post_data(params.is_post); |
| 724 | 729 |
| 725 InsertOrReplaceEntry(new_entry, *did_replace_entry); | 730 InsertOrReplaceEntry(new_entry, *did_replace_entry); |
| 726 } | 731 } |
| 727 | 732 |
| 728 void NavigationController::RendererDidNavigateToExistingPage( | 733 void NavigationController::RendererDidNavigateToExistingPage( |
| 729 const ViewHostMsg_FrameNavigate_Params& params) { | 734 const ViewHostMsg_FrameNavigate_Params& params) { |
| 730 // We should only get here for main frame navigations. | 735 // We should only get here for main frame navigations. |
| 731 DCHECK(PageTransition::IsMainFrame(params.transition)); | 736 DCHECK(content::PageTransitionIsMainFrame(params.transition)); |
| 732 | 737 |
| 733 // This is a back/forward navigation. The existing page for the ID is | 738 // This is a back/forward navigation. The existing page for the ID is |
| 734 // guaranteed to exist by ClassifyNavigation, and we just need to update it | 739 // guaranteed to exist by ClassifyNavigation, and we just need to update it |
| 735 // with new information from the renderer. | 740 // with new information from the renderer. |
| 736 int entry_index = GetEntryIndexWithPageID(tab_contents_->GetSiteInstance(), | 741 int entry_index = GetEntryIndexWithPageID(tab_contents_->GetSiteInstance(), |
| 737 params.page_id); | 742 params.page_id); |
| 738 DCHECK(entry_index >= 0 && | 743 DCHECK(entry_index >= 0 && |
| 739 entry_index < static_cast<int>(entries_.size())); | 744 entry_index < static_cast<int>(entries_.size())); |
| 740 NavigationEntry* entry = entries_[entry_index].get(); | 745 NavigationEntry* entry = entries_[entry_index].get(); |
| 741 | 746 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 786 // The URL may have changed due to redirects. | 791 // The URL may have changed due to redirects. |
| 787 if (existing_entry->update_virtual_url_with_url()) | 792 if (existing_entry->update_virtual_url_with_url()) |
| 788 UpdateVirtualURLToURL(existing_entry, params.url); | 793 UpdateVirtualURLToURL(existing_entry, params.url); |
| 789 existing_entry->set_url(params.url); | 794 existing_entry->set_url(params.url); |
| 790 | 795 |
| 791 DiscardNonCommittedEntries(); | 796 DiscardNonCommittedEntries(); |
| 792 } | 797 } |
| 793 | 798 |
| 794 void NavigationController::RendererDidNavigateInPage( | 799 void NavigationController::RendererDidNavigateInPage( |
| 795 const ViewHostMsg_FrameNavigate_Params& params, bool* did_replace_entry) { | 800 const ViewHostMsg_FrameNavigate_Params& params, bool* did_replace_entry) { |
| 796 DCHECK(PageTransition::IsMainFrame(params.transition)) << | 801 DCHECK(content::PageTransitionIsMainFrame(params.transition)) << |
| 797 "WebKit should only tell us about in-page navs for the main frame."; | 802 "WebKit should only tell us about in-page navs for the main frame."; |
| 798 // We're guaranteed to have an entry for this one. | 803 // We're guaranteed to have an entry for this one. |
| 799 NavigationEntry* existing_entry = GetEntryWithPageID( | 804 NavigationEntry* existing_entry = GetEntryWithPageID( |
| 800 tab_contents_->GetSiteInstance(), | 805 tab_contents_->GetSiteInstance(), |
| 801 params.page_id); | 806 params.page_id); |
| 802 | 807 |
| 803 // Reference fragment navigation. We're guaranteed to have the last_committed | 808 // Reference fragment navigation. We're guaranteed to have the last_committed |
| 804 // entry and it will be the same page as the new navigation (minus the | 809 // entry and it will be the same page as the new navigation (minus the |
| 805 // reference fragments, of course). We'll update the URL of the existing | 810 // reference fragments, of course). We'll update the URL of the existing |
| 806 // entry without pruning the forward history. | 811 // entry without pruning the forward history. |
| 807 existing_entry->set_url(params.url); | 812 existing_entry->set_url(params.url); |
| 808 if (existing_entry->update_virtual_url_with_url()) | 813 if (existing_entry->update_virtual_url_with_url()) |
| 809 UpdateVirtualURLToURL(existing_entry, params.url); | 814 UpdateVirtualURLToURL(existing_entry, params.url); |
| 810 | 815 |
| 811 // This replaces the existing entry since the page ID didn't change. | 816 // This replaces the existing entry since the page ID didn't change. |
| 812 *did_replace_entry = true; | 817 *did_replace_entry = true; |
| 813 | 818 |
| 814 if (pending_entry_) | 819 if (pending_entry_) |
| 815 DiscardNonCommittedEntriesInternal(); | 820 DiscardNonCommittedEntriesInternal(); |
| 816 | 821 |
| 817 // If a transient entry was removed, the indices might have changed, so we | 822 // If a transient entry was removed, the indices might have changed, so we |
| 818 // have to query the entry index again. | 823 // have to query the entry index again. |
| 819 last_committed_entry_index_ = | 824 last_committed_entry_index_ = |
| 820 GetEntryIndexWithPageID(tab_contents_->GetSiteInstance(), params.page_id); | 825 GetEntryIndexWithPageID(tab_contents_->GetSiteInstance(), params.page_id); |
| 821 } | 826 } |
| 822 | 827 |
| 823 void NavigationController::RendererDidNavigateNewSubframe( | 828 void NavigationController::RendererDidNavigateNewSubframe( |
| 824 const ViewHostMsg_FrameNavigate_Params& params) { | 829 const ViewHostMsg_FrameNavigate_Params& params) { |
| 825 if (PageTransition::StripQualifier(params.transition) == | 830 if (content::PageTransitionStripQualifier(params.transition) == |
| 826 PageTransition::AUTO_SUBFRAME) { | 831 content::PAGE_TRANSITION_AUTO_SUBFRAME) { |
| 827 // This is not user-initiated. Ignore. | 832 // This is not user-initiated. Ignore. |
| 828 return; | 833 return; |
| 829 } | 834 } |
| 830 | 835 |
| 831 // Manual subframe navigations just get the current entry cloned so the user | 836 // Manual subframe navigations just get the current entry cloned so the user |
| 832 // can go back or forward to it. The actual subframe information will be | 837 // can go back or forward to it. The actual subframe information will be |
| 833 // stored in the page state for each of those entries. This happens out of | 838 // stored in the page state for each of those entries. This happens out of |
| 834 // band with the actual navigations. | 839 // band with the actual navigations. |
| 835 DCHECK(GetLastCommittedEntry()) << "ClassifyNavigation should guarantee " | 840 DCHECK(GetLastCommittedEntry()) << "ClassifyNavigation should guarantee " |
| 836 << "that a last committed entry exists."; | 841 << "that a last committed entry exists."; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 998 | 1003 |
| 999 // If there was a transient entry, invalidate everything so the new active | 1004 // If there was a transient entry, invalidate everything so the new active |
| 1000 // entry state is shown. | 1005 // entry state is shown. |
| 1001 if (transient) { | 1006 if (transient) { |
| 1002 tab_contents_->NotifyNavigationStateChanged(kInvalidateAll); | 1007 tab_contents_->NotifyNavigationStateChanged(kInvalidateAll); |
| 1003 } | 1008 } |
| 1004 } | 1009 } |
| 1005 | 1010 |
| 1006 void NavigationController::InsertOrReplaceEntry(NavigationEntry* entry, | 1011 void NavigationController::InsertOrReplaceEntry(NavigationEntry* entry, |
| 1007 bool replace) { | 1012 bool replace) { |
| 1008 DCHECK(entry->transition_type() != PageTransition::AUTO_SUBFRAME); | 1013 DCHECK(entry->transition_type() != content::PAGE_TRANSITION_AUTO_SUBFRAME); |
| 1009 | 1014 |
| 1010 // Copy the pending entry's unique ID to the committed entry. | 1015 // Copy the pending entry's unique ID to the committed entry. |
| 1011 // I don't know if pending_entry_index_ can be other than -1 here. | 1016 // I don't know if pending_entry_index_ can be other than -1 here. |
| 1012 const NavigationEntry* const pending_entry = (pending_entry_index_ == -1) ? | 1017 const NavigationEntry* const pending_entry = (pending_entry_index_ == -1) ? |
| 1013 pending_entry_ : entries_[pending_entry_index_].get(); | 1018 pending_entry_ : entries_[pending_entry_index_].get(); |
| 1014 if (pending_entry) | 1019 if (pending_entry) |
| 1015 entry->set_unique_id(pending_entry->unique_id()); | 1020 entry->set_unique_id(pending_entry->unique_id()); |
| 1016 | 1021 |
| 1017 DiscardNonCommittedEntriesInternal(); | 1022 DiscardNonCommittedEntriesInternal(); |
| 1018 | 1023 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1056 // a session history navigation to the last committed page, RenderViewHost | 1061 // a session history navigation to the last committed page, RenderViewHost |
| 1057 // will force the throbber to start, but WebKit will essentially ignore the | 1062 // will force the throbber to start, but WebKit will essentially ignore the |
| 1058 // navigation, and won't send a message to stop the throbber. To prevent this | 1063 // navigation, and won't send a message to stop the throbber. To prevent this |
| 1059 // from happening, we drop the navigation here and stop the slow-to-commit | 1064 // from happening, we drop the navigation here and stop the slow-to-commit |
| 1060 // page from loading (which would normally happen during the navigation). | 1065 // page from loading (which would normally happen during the navigation). |
| 1061 if (pending_entry_index_ != -1 && | 1066 if (pending_entry_index_ != -1 && |
| 1062 pending_entry_index_ == last_committed_entry_index_ && | 1067 pending_entry_index_ == last_committed_entry_index_ && |
| 1063 (entries_[pending_entry_index_]->restore_type() == | 1068 (entries_[pending_entry_index_]->restore_type() == |
| 1064 NavigationEntry::RESTORE_NONE) && | 1069 NavigationEntry::RESTORE_NONE) && |
| 1065 (entries_[pending_entry_index_]->transition_type() & | 1070 (entries_[pending_entry_index_]->transition_type() & |
| 1066 PageTransition::FORWARD_BACK)) { | 1071 content::PAGE_TRANSITION_FORWARD_BACK)) { |
| 1067 tab_contents_->Stop(); | 1072 tab_contents_->Stop(); |
| 1068 DiscardNonCommittedEntries(); | 1073 DiscardNonCommittedEntries(); |
| 1069 return; | 1074 return; |
| 1070 } | 1075 } |
| 1071 | 1076 |
| 1072 // For session history navigations only the pending_entry_index_ is set. | 1077 // For session history navigations only the pending_entry_index_ is set. |
| 1073 if (!pending_entry_) { | 1078 if (!pending_entry_) { |
| 1074 DCHECK_NE(pending_entry_index_, -1); | 1079 DCHECK_NE(pending_entry_index_, -1); |
| 1075 pending_entry_ = entries_[pending_entry_index_].get(); | 1080 pending_entry_ = entries_[pending_entry_index_].get(); |
| 1076 } | 1081 } |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1194 size_t insert_index = 0; | 1199 size_t insert_index = 0; |
| 1195 for (int i = 0; i < max_index; i++) { | 1200 for (int i = 0; i < max_index; i++) { |
| 1196 // When cloning a tab, copy all entries except interstitial pages | 1201 // When cloning a tab, copy all entries except interstitial pages |
| 1197 if (source.entries_[i].get()->page_type() != INTERSTITIAL_PAGE) { | 1202 if (source.entries_[i].get()->page_type() != INTERSTITIAL_PAGE) { |
| 1198 entries_.insert(entries_.begin() + insert_index++, | 1203 entries_.insert(entries_.begin() + insert_index++, |
| 1199 linked_ptr<NavigationEntry>( | 1204 linked_ptr<NavigationEntry>( |
| 1200 new NavigationEntry(*source.entries_[i]))); | 1205 new NavigationEntry(*source.entries_[i]))); |
| 1201 } | 1206 } |
| 1202 } | 1207 } |
| 1203 } | 1208 } |
| OLD | NEW |