#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 {
image_delegate_(NULL),
loading_complete_(false),
received_paint_update_(false),
- pending_entry_id_(0),
slide_direction_(SLIDE_UNKNOWN) {
}
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.
// 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(
}
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