| Index: content/browser/web_contents/aura/overscroll_navigation_overlay.cc
|
| diff --git a/content/browser/web_contents/aura/overscroll_navigation_overlay.cc b/content/browser/web_contents/aura/overscroll_navigation_overlay.cc
|
| index 530028b6721af7685fab55f4293e12554d80cd74..260668844d268615af4d52a191d9a801f029b7ed 100644
|
| --- a/content/browser/web_contents/aura/overscroll_navigation_overlay.cc
|
| +++ b/content/browser/web_contents/aura/overscroll_navigation_overlay.cc
|
| @@ -21,6 +21,24 @@
|
| #include "ui/gfx/image/image_skia.h"
|
|
|
| namespace content {
|
| +namespace {
|
| +
|
| +// Returns true if the entry's URL or any of the URLs in entry's redirect chain
|
| +// match |url|.
|
| +bool DoesEntryMatchURL(NavigationEntry* entry, const GURL& url) {
|
| + if (entry->GetURL() == url)
|
| + return true;
|
| + const std::vector<GURL>& redirect_chain = entry->GetRedirectChain();
|
| + for (std::vector<GURL>::const_iterator it = redirect_chain.begin();
|
| + it != redirect_chain.end();
|
| + it++) {
|
| + if (*it == url)
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +} // namespace
|
|
|
| // A LayerDelegate that paints an image for the layer.
|
| class ImageLayerDelegate : public ui::LayerDelegate {
|
| @@ -116,7 +134,6 @@ OverscrollNavigationOverlay::OverscrollNavigationOverlay(
|
| image_delegate_(NULL),
|
| loading_complete_(false),
|
| received_paint_update_(false),
|
| - pending_entry_id_(0),
|
| slide_direction_(SLIDE_UNKNOWN) {
|
| }
|
|
|
| @@ -127,7 +144,6 @@ void OverscrollNavigationOverlay::StartObserving() {
|
| loading_complete_ = false;
|
| received_paint_update_ = false;
|
| overlay_dismiss_layer_.reset();
|
| - pending_entry_id_ = 0;
|
| Observe(web_contents_);
|
|
|
| // Make sure the overlay window is on top.
|
| @@ -137,10 +153,10 @@ void OverscrollNavigationOverlay::StartObserving() {
|
| // Assumes the navigation has been initiated.
|
| NavigationEntry* pending_entry =
|
| web_contents_->GetController().GetPendingEntry();
|
| - // Save id of the pending entry to identify when it loads and paints later.
|
| + // Save url of the pending entry to identify when it loads and paints later.
|
| // Under some circumstances navigation can leave a null pending entry -
|
| // see comments in NavigationControllerImpl::NavigateToPendingEntry().
|
| - pending_entry_id_ = pending_entry ? pending_entry->GetUniqueID() : 0;
|
| + pending_entry_url_ = pending_entry ? pending_entry->GetURL() : GURL();
|
| }
|
|
|
| void OverscrollNavigationOverlay::SetOverlayWindow(
|
| @@ -279,23 +295,21 @@ void OverscrollNavigationOverlay::OnWindowSliderDestroyed() {
|
| }
|
|
|
| void OverscrollNavigationOverlay::DidFirstVisuallyNonEmptyPaint() {
|
| - int visible_entry_id =
|
| - web_contents_->GetController().GetVisibleEntry()->GetUniqueID();
|
| - if (visible_entry_id == pending_entry_id_ || !pending_entry_id_) {
|
| + NavigationEntry* visible_entry =
|
| + web_contents_->GetController().GetVisibleEntry();
|
| + if (pending_entry_url_.is_empty() ||
|
| + DoesEntryMatchURL(visible_entry, pending_entry_url_)) {
|
| received_paint_update_ = true;
|
| StopObservingIfDone();
|
| }
|
| }
|
|
|
| void OverscrollNavigationOverlay::DidStopLoading(RenderViewHost* host) {
|
| - // Use the last committed entry rather than the active one, in case a
|
| - // pending entry has been created.
|
| - int committed_entry_id =
|
| - web_contents_->GetController().GetLastCommittedEntry()->GetUniqueID();
|
| - if (committed_entry_id == pending_entry_id_ || !pending_entry_id_) {
|
| - loading_complete_ = true;
|
| - StopObservingIfDone();
|
| - }
|
| + // Don't compare URLs in this case - it's possible they won't match if
|
| + // a gesture-nav initiated navigation was interrupted by some other in-site
|
| + // navigation ((e.g., from a script, or from a bookmark).
|
| + loading_complete_ = true;
|
| + StopObservingIfDone();
|
| }
|
|
|
| } // namespace content
|
|
|