diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-18 00:41:02 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-18 00:41:02 +0000 |
commit | 921f159b85924d2098ec2c9682017e79fe0063e0 (patch) | |
tree | 769b91603d9266a6e911107d05ce7b206f7b0ceb /content/renderer/load_progress_tracker.cc | |
parent | 481cea494f9865ee3e62ca63ea29f92ba5392898 (diff) | |
download | chromium_src-921f159b85924d2098ec2c9682017e79fe0063e0.zip chromium_src-921f159b85924d2098ec2c9682017e79fe0063e0.tar.gz chromium_src-921f159b85924d2098ec2c9682017e79fe0063e0.tar.bz2 |
Move a bunch more random files from chrome\renderer to content\renderer.
TBR=avi
Review URL: http://codereview.chromium.org/6685072
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78640 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/load_progress_tracker.cc')
-rw-r--r-- | content/renderer/load_progress_tracker.cc | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/content/renderer/load_progress_tracker.cc b/content/renderer/load_progress_tracker.cc new file mode 100644 index 0000000..aa384f6 --- /dev/null +++ b/content/renderer/load_progress_tracker.cc @@ -0,0 +1,86 @@ +// Copyright (c) 2010 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 "content/renderer/load_progress_tracker.h" + +#include "base/message_loop.h" +#include "chrome/common/render_messages.h" +#include "chrome/renderer/render_view.h" + +namespace { + +const int kMinimumDelayBetweenUpdatesMS = 100; + +} + +LoadProgressTracker::LoadProgressTracker(RenderView* render_view) + : render_view_(render_view), + tracked_frame_(NULL), + progress_(0.0), + ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { +} + +LoadProgressTracker::~LoadProgressTracker() { +} + +void LoadProgressTracker::DidStopLoading() { + if (!tracked_frame_) + return; + + // Load stoped while we were still tracking load. Make sure we notify the + // browser that load is complete. + progress_ = 1.0; + SendChangeLoadProgress(); + // Then we clean-up our states. + ResetStates(); +} + +void LoadProgressTracker::DidChangeLoadProgress(WebKit::WebFrame* frame, + double progress) { + if (tracked_frame_ && frame != tracked_frame_) + return; + + if (!tracked_frame_) + tracked_frame_ = frame; + + progress_ = 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 + // is loaded, it might not execute a posted task in a timely manner so we make + // sure to immediately send progress report if enough time has passed. + if (progress == 1.0 || last_time_progress_sent_.is_null() || + (base::TimeTicks::Now() - last_time_progress_sent_).InMilliseconds() > + kMinimumDelayBetweenUpdatesMS) { + // If there is a pending task to send progress, it is now obsolete. + method_factory_.RevokeAll(); + SendChangeLoadProgress(); + if (progress == 1.0) + ResetStates(); + return; + } + + if (!method_factory_.empty()) + return; + + MessageLoop::current()->PostDelayedTask( + FROM_HERE, + method_factory_.NewRunnableMethod( + &LoadProgressTracker::SendChangeLoadProgress), + kMinimumDelayBetweenUpdatesMS); +} + +void LoadProgressTracker::SendChangeLoadProgress() { + last_time_progress_sent_ = base::TimeTicks::Now(); + render_view_->Send( + new ViewHostMsg_DidChangeLoadProgress(render_view_->routing_id(), + progress_)); +} + +void LoadProgressTracker::ResetStates() { + tracked_frame_ = NULL; + progress_ = 0.0; + method_factory_.RevokeAll(); + last_time_progress_sent_ = base::TimeTicks(); +} |