summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/render_view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/render_view.cc')
-rw-r--r--chrome/renderer/render_view.cc43
1 files changed, 34 insertions, 9 deletions
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 2391ab6..c4af4c9 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -187,9 +187,16 @@ static const int kDelayForCaptureMs = 500;
// delay.
static const int kDelayForForcedCaptureMs = 6000;
-// The default value for RenderView.delay_seconds_for_form_state_sync_, see
-// that variable for more.
-const int kDefaultDelaySecondsForFormStateSync = 5;
+// Time, in seconds, we delay before sending content state changes (such as form
+// state and scroll position) to the browser. We delay sending changes to avoid
+// spamming the browser.
+// To avoid having tab/session restore require sending a message to get the
+// current content state during tab closing we use a shorter timeout for the
+// foreground renderer. This means there is a small window of time from which
+// content state is modified and not sent to session restore, but this is
+// better than having to wake up all renderers during shutdown.
+static const int kDelaySecondsForContentStateSyncHidden = 5;
+static const int kDelaySecondsForContentStateSync = 1;
// The maximum number of popups that can be spawned from one page.
static const int kMaximumNumberOfUnacknowledgedPopups = 25;
@@ -234,7 +241,7 @@ RenderView::RenderView(RenderThreadBase* render_thread,
autofill_query_id_(0),
popup_notification_visible_(false),
spelling_panel_visible_(false),
- delay_seconds_for_form_state_sync_(kDefaultDelaySecondsForFormStateSync),
+ send_content_state_immediately_(false),
send_preferred_size_changes_(false),
ALLOW_THIS_IN_INITIALIZER_LIST(
notification_provider_(new NotificationProvider(this))),
@@ -1610,6 +1617,28 @@ void RenderView::UpdateTargetURL(const GURL& url, const GURL& fallback_url) {
}
}
+void RenderView::StartNavStateSyncTimerIfNecessary() {
+ int delay;
+ if (send_content_state_immediately_)
+ delay = 0;
+ else if (is_hidden())
+ delay = kDelaySecondsForContentStateSyncHidden;
+ else
+ delay = kDelaySecondsForContentStateSync;
+
+ if (nav_state_sync_timer_.IsRunning()) {
+ // The timer is already running. If the delay of the timer maches the amount
+ // we want to delay by, then return. Otherwise stop the timer so that it
+ // gets started with the right delay.
+ if (nav_state_sync_timer_.GetCurrentDelay().InSeconds() == delay)
+ return;
+ nav_state_sync_timer_.Stop();
+ }
+
+ nav_state_sync_timer_.Start(
+ TimeDelta::FromSeconds(delay), this, &RenderView::SyncNavigationState);
+}
+
void RenderView::setMouseOverURL(const WebURL& url) {
mouse_over_url_ = GURL(url);
UpdateTargetURL(mouse_over_url_, focus_url_);
@@ -2316,11 +2345,7 @@ void RenderView::didChangeLocationWithinPage(
}
void RenderView::didUpdateCurrentHistoryItem(WebFrame* frame) {
- if (!nav_state_sync_timer_.IsRunning()) {
- nav_state_sync_timer_.Start(
- TimeDelta::FromSeconds(delay_seconds_for_form_state_sync_), this,
- &RenderView::SyncNavigationState);
- }
+ StartNavStateSyncTimerIfNecessary();
}
void RenderView::assignIdentifierToRequest(