blob: 3345d06dcacfff1ced389b7631cc025d5e229e11 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "blimp/engine/session/page_load_tracker.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/render_widget_host_view.h"
namespace blimp {
namespace engine {
namespace {
bool ShouldIgnoreNavigation(content::NavigationHandle* navigation_handle) {
// We change the progress bar for main frame navigations only.
if (!navigation_handle->IsInMainFrame())
return true;
// Same page navigations don't need to trigger a progress bar update.
if (navigation_handle->IsSamePage())
return true;
return false;
}
} // namespace
PageLoadTracker::PageLoadTracker(content::WebContents* web_contents,
PageLoadTrackerClient* client)
: client_(client) {
DCHECK(web_contents);
Observe(web_contents);
}
PageLoadTracker::~PageLoadTracker() {}
void PageLoadTracker::DidStartNavigation(
content::NavigationHandle* navigation_handle) {
if (ShouldIgnoreNavigation(navigation_handle))
return;
// Cancel any pending callbacks for the previous navigation. We will send an
// update based on the progress of this navigation.
did_paint_after_navigation_callback_.Cancel();
client_->SendPageLoadStatusUpdate(PageLoadStatus::LOADING);
}
void PageLoadTracker::DidFinishNavigation(
content::NavigationHandle* navigation_handle) {
if (ShouldIgnoreNavigation(navigation_handle))
return;
if (navigation_handle->HasCommitted()) {
// Make sure that at least one compositor content update after the
// navigation commits is sent to the client.
// Note that a visual state update in our case implies that this callback
// will be invoked after the update is queued to be sent to the client.
did_paint_after_navigation_callback_.Reset(
base::Bind(&PageLoadTracker::DidPaintAfterNavigationCommitted,
base::Unretained(this)));
navigation_handle->GetRenderFrameHost()->InsertVisualStateCallback(
did_paint_after_navigation_callback_.callback());
} else {
// Inform the client to update the progress bar right away.
client_->SendPageLoadStatusUpdate(PageLoadStatus::LOADED);
}
}
void PageLoadTracker::DidPaintAfterNavigationCommitted(bool result) {
client_->SendPageLoadStatusUpdate(PageLoadStatus::LOADED);
}
} // namespace engine
} // namespace blimp