| Index: content/renderer/render_view_impl.cc
|
| diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
|
| index ef5087f895127e0761e31192d3420de843face67..077b624c1cc5ebc3f8d24364f8faf9bb30bebdda 100644
|
| --- a/content/renderer/render_view_impl.cc
|
| +++ b/content/renderer/render_view_impl.cc
|
| @@ -325,8 +325,8 @@
|
| // 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.
|
| -const int kHiddenPageStateSendingDelaySeconds = 5;
|
| -const int kPageStateSendingDelaySeconds = 1;
|
| +const int kDelaySecondsForContentStateSyncHidden = 5;
|
| +const int kDelaySecondsForContentStateSync = 1;
|
|
|
| #if defined(OS_ANDROID)
|
| // Delay between tapping in content and launching the associated android intent.
|
| @@ -649,14 +649,13 @@
|
| params->hidden,
|
| params->never_visible),
|
| webkit_preferences_(params->webkit_prefs),
|
| + send_content_state_immediately_(false),
|
| enabled_bindings_(0),
|
| send_preferred_size_changes_(false),
|
| navigation_gesture_(NavigationGestureUnknown),
|
| opened_by_user_gesture_(true),
|
| opener_suppressed_(false),
|
| suppress_dialogs_until_swap_out_(false),
|
| - page_state_sent_immediately_(false),
|
| - page_state_dirty_(false),
|
| page_id_(-1),
|
| last_page_id_sent_to_browser_(-1),
|
| next_page_id_(params->next_page_id),
|
| @@ -1528,6 +1527,29 @@
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| +// Sends the current history state to the browser so it will be saved before we
|
| +// navigate to a new page.
|
| +void RenderViewImpl::UpdateSessionHistory(WebFrame* frame) {
|
| + // If we have a valid page ID at this point, then it corresponds to the page
|
| + // we are navigating away from. Otherwise, this is the first navigation, so
|
| + // there is no past session history to record.
|
| + if (page_id_ == -1)
|
| + return;
|
| + SendUpdateState(history_controller_->GetCurrentEntry());
|
| +}
|
| +
|
| +void RenderViewImpl::SendUpdateState(HistoryEntry* entry) {
|
| + if (!entry)
|
| + return;
|
| +
|
| + // Don't send state updates for kSwappedOutURL.
|
| + if (entry->root().urlString() == WebString::fromUTF8(kSwappedOutURL))
|
| + return;
|
| +
|
| + Send(new ViewHostMsg_UpdateState(
|
| + routing_id_, page_id_, HistoryEntryToPageState(entry)));
|
| +}
|
| +
|
| bool RenderViewImpl::SendAndRunNestedMessageLoop(IPC::SyncMessage* message) {
|
| // Before WebKit asks us to show an alert (etc.), it takes care of doing the
|
| // equivalent of WebView::willEnterModalLoop. In the case of showModalDialog
|
| @@ -1877,50 +1899,30 @@
|
| return window_rect;
|
| }
|
|
|
| -void RenderViewImpl::MarkPageStateAsDirty() {
|
| - // No need to send state if no page has committed yet.
|
| +void RenderViewImpl::StartNavStateSyncTimerIfNecessary() {
|
| + // No need to update state if no page has committed yet.
|
| if (page_id_ == -1)
|
| return;
|
|
|
| - page_state_dirty_ = true;
|
| -
|
| int delay;
|
| - if (page_state_sent_immediately_)
|
| + if (send_content_state_immediately_)
|
| delay = 0;
|
| else if (is_hidden())
|
| - delay = kHiddenPageStateSendingDelaySeconds;
|
| + delay = kDelaySecondsForContentStateSyncHidden;
|
| else
|
| - delay = kPageStateSendingDelaySeconds;
|
| -
|
| - if (page_state_timer_.IsRunning()) {
|
| + 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 (page_state_timer_.GetCurrentDelay().InSeconds() == delay)
|
| + if (nav_state_sync_timer_.GetCurrentDelay().InSeconds() == delay)
|
| return;
|
| - page_state_timer_.Stop();
|
| - }
|
| -
|
| - page_state_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this,
|
| - &RenderViewImpl::FlushPageState);
|
| -}
|
| -
|
| -void RenderViewImpl::FlushPageState() {
|
| - if (!page_state_dirty_ || page_id_ == -1 || !webview())
|
| - return;
|
| -
|
| - HistoryEntry* entry = history_controller_->GetCurrentEntry();
|
| - if (!entry)
|
| - return;
|
| -
|
| - // Don't send state updates for kSwappedOutURL.
|
| - if (entry->root().urlString() == WebString::fromUTF8(kSwappedOutURL))
|
| - return;
|
| -
|
| - Send(new ViewHostMsg_UpdateState(
|
| - routing_id_, page_id_, HistoryEntryToPageState(entry)));
|
| -
|
| - page_state_dirty_ = false;
|
| + nav_state_sync_timer_.Stop();
|
| + }
|
| +
|
| + nav_state_sync_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this,
|
| + &RenderViewImpl::SyncNavigationState);
|
| }
|
|
|
| void RenderViewImpl::setMouseOverURL(const WebURL& url) {
|
| @@ -2406,7 +2408,7 @@
|
| }
|
|
|
| void RenderViewImpl::didUpdateCurrentHistoryItem(WebLocalFrame* frame) {
|
| - MarkPageStateAsDirty();
|
| + StartNavStateSyncTimerIfNecessary();
|
| }
|
|
|
| void RenderViewImpl::CheckPreferredSize() {
|
| @@ -2439,7 +2441,7 @@
|
| }
|
|
|
| void RenderViewImpl::didChangeScrollOffset(WebLocalFrame* frame) {
|
| - MarkPageStateAsDirty();
|
| + StartNavStateSyncTimerIfNecessary();
|
|
|
| FOR_EACH_OBSERVER(
|
| RenderViewObserver, observers_, DidChangeScrollOffset(frame));
|
| @@ -2563,8 +2565,8 @@
|
| return enabled_bindings_;
|
| }
|
|
|
| -bool RenderViewImpl::IsPageStateSentImmediately() const {
|
| - return page_state_sent_immediately_;
|
| +bool RenderViewImpl::GetContentStateImmediately() const {
|
| + return send_content_state_immediately_;
|
| }
|
|
|
| blink::WebPageVisibilityState RenderViewImpl::GetVisibilityState() const {
|
| @@ -2579,8 +2581,10 @@
|
| main_render_frame_->didStopLoading();
|
| }
|
|
|
| -void RenderViewImpl::ForcePageStateFlushForTesting() {
|
| - FlushPageState();
|
| +void RenderViewImpl::SyncNavigationState() {
|
| + if (!webview())
|
| + return;
|
| + SendUpdateState(history_controller_->GetCurrentEntry());
|
| }
|
|
|
| blink::WebPlugin* RenderViewImpl::GetWebPluginForFind() {
|
|
|