| Index: content/renderer/load_progress_tracker.cc
|
| diff --git a/content/renderer/load_progress_tracker.cc b/content/renderer/load_progress_tracker.cc
|
| index 0cc26fdcccf14ef4ac74b52f9ea36d252fe85d91..5e7d07eb6cfeaa1f717227a1fb72f9f8acca5272 100644
|
| --- a/content/renderer/load_progress_tracker.cc
|
| +++ b/content/renderer/load_progress_tracker.cc
|
| @@ -14,39 +14,42 @@ namespace {
|
|
|
| const int kMinimumDelayBetweenUpdatesMS = 100;
|
|
|
| +// This matches what blink's ProgrssTracker has traditionally used for a
|
| +// minimum progress value.
|
| +const double kMinimumProgress = 0.1;
|
| +
|
| }
|
|
|
| LoadProgressTracker::LoadProgressTracker(RenderViewImpl* render_view)
|
| : render_view_(render_view),
|
| - tracked_frame_(NULL),
|
| - progress_(0.0),
|
| + total_progress_(0.0),
|
| weak_factory_(this) {
|
| }
|
|
|
| LoadProgressTracker::~LoadProgressTracker() {
|
| }
|
|
|
| -void LoadProgressTracker::DidStopLoading() {
|
| - if (!tracked_frame_)
|
| +void LoadProgressTracker::DidStartLoading(int frame_routing_id) {
|
| + progresses_[frame_routing_id] = kMinimumProgress;
|
| + SendChangeLoadProgress();
|
| +}
|
| +
|
| +void LoadProgressTracker::DidStopLoading(int frame_routing_id) {
|
| + if (progresses_.find(frame_routing_id) == progresses_.end())
|
| return;
|
|
|
| - // Load stopped while we were still tracking load. Make sure we notify the
|
| - // browser that load is complete.
|
| - progress_ = 1.0;
|
| + // Load stopped while we were still tracking load. Make sure we update
|
| + // progress based on this frame's completion.
|
| + progresses_[frame_routing_id] = 1.0;
|
| SendChangeLoadProgress();
|
| // Then we clean-up our states.
|
| - ResetStates();
|
| + if (total_progress_ == 1.0)
|
| + ResetStates();
|
| }
|
|
|
| -void LoadProgressTracker::DidChangeLoadProgress(blink::WebFrame* frame,
|
| +void LoadProgressTracker::DidChangeLoadProgress(int frame_routing_id,
|
| double progress) {
|
| - if (tracked_frame_ && frame != tracked_frame_)
|
| - return;
|
| -
|
| - if (!tracked_frame_)
|
| - tracked_frame_ = frame;
|
| -
|
| - progress_ = progress;
|
| + progresses_[frame_routing_id] = progress;
|
|
|
| // We send the progress change to the browser immediately for the first and
|
| // last updates. Also, since the message loop may be pretty busy when a page
|
| @@ -55,12 +58,11 @@ void LoadProgressTracker::DidChangeLoadProgress(blink::WebFrame* frame,
|
| base::TimeDelta min_delay =
|
| base::TimeDelta::FromMilliseconds(kMinimumDelayBetweenUpdatesMS);
|
| if (progress == 1.0 || last_time_progress_sent_.is_null() ||
|
| - base::TimeTicks::Now() - last_time_progress_sent_ >
|
| - min_delay) {
|
| + base::TimeTicks::Now() - last_time_progress_sent_ > min_delay) {
|
| // If there is a pending task to send progress, it is now obsolete.
|
| weak_factory_.InvalidateWeakPtrs();
|
| SendChangeLoadProgress();
|
| - if (progress == 1.0)
|
| + if (total_progress_ == 1.0)
|
| ResetStates();
|
| return;
|
| }
|
| @@ -77,14 +79,30 @@ void LoadProgressTracker::DidChangeLoadProgress(blink::WebFrame* frame,
|
|
|
| void LoadProgressTracker::SendChangeLoadProgress() {
|
| last_time_progress_sent_ = base::TimeTicks::Now();
|
| + double progress = 0.0;
|
| + unsigned frameCount = 0;
|
| + ProgressMap::iterator end = progresses_.end();
|
| + for (ProgressMap::iterator it = progresses_.begin(); it != end; ++it) {
|
| + progress += it->second;
|
| + frameCount++;
|
| + }
|
| + if (frameCount == 0)
|
| + return;
|
| + progress /= frameCount;
|
| + DCHECK(progress <= 1.0);
|
| +
|
| + if (progress <= total_progress_)
|
| + return;
|
| + total_progress_ = progress;
|
| +
|
| render_view_->Send(
|
| new ViewHostMsg_DidChangeLoadProgress(render_view_->routing_id(),
|
| - progress_));
|
| + progress));
|
| }
|
|
|
| void LoadProgressTracker::ResetStates() {
|
| - tracked_frame_ = NULL;
|
| - progress_ = 0.0;
|
| + progresses_.clear();
|
| + total_progress_ = 0.0;
|
| weak_factory_.InvalidateWeakPtrs();
|
| last_time_progress_sent_ = base::TimeTicks();
|
| }
|
|
|