Index: content/renderer/render_view_impl.cc |
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc |
index 077b624c1cc5ebc3f8d24364f8faf9bb30bebdda..9f667f1e79120c50cf7faf5e4dd7c4794990234f 100644 |
--- a/content/renderer/render_view_impl.cc |
+++ b/content/renderer/render_view_impl.cc |
@@ -325,8 +325,8 @@ static base::LazyInstance<RoutingIDViewMap> g_routing_id_view_map = |
// 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 kDelaySecondsForContentStateSyncHidden = 5; |
-const int kDelaySecondsForContentStateSync = 1; |
+const int kHiddenPageStateSendingDelaySeconds = 5; |
+const int kPageStateSendingDelaySeconds = 1; |
#if defined(OS_ANDROID) |
// Delay between tapping in content and launching the associated android intent. |
@@ -649,13 +649,14 @@ RenderViewImpl::RenderViewImpl(RenderViewImplParams* params) |
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), |
@@ -1527,29 +1528,6 @@ void RenderViewImpl::OnSetInLiveResize(bool in_live_resize) { |
/////////////////////////////////////////////////////////////////////////////// |
-// 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 |
@@ -1899,30 +1877,50 @@ gfx::RectF RenderViewImpl::ClientRectToPhysicalWindowRect( |
return window_rect; |
} |
-void RenderViewImpl::StartNavStateSyncTimerIfNecessary() { |
- // No need to update state if no page has committed yet. |
+void RenderViewImpl::MarkPageStateAsDirty() { |
+ // No need to send state if no page has committed yet. |
if (page_id_ == -1) |
return; |
+ page_state_dirty_ = true; |
+ |
int delay; |
- if (send_content_state_immediately_) |
+ if (page_state_sent_immediately_) |
delay = 0; |
else if (is_hidden()) |
- delay = kDelaySecondsForContentStateSyncHidden; |
+ delay = kHiddenPageStateSendingDelaySeconds; |
else |
- delay = kDelaySecondsForContentStateSync; |
+ delay = kPageStateSendingDelaySeconds; |
- if (nav_state_sync_timer_.IsRunning()) { |
+ if (page_state_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) |
+ if (page_state_timer_.GetCurrentDelay().InSeconds() == delay) |
return; |
- nav_state_sync_timer_.Stop(); |
+ page_state_timer_.Stop(); |
} |
- nav_state_sync_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this, |
- &RenderViewImpl::SyncNavigationState); |
+ page_state_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this, |
+ &RenderViewImpl::FlushPageState); |
+} |
+ |
+void RenderViewImpl::FlushPageState() { |
+ if (!page_state_dirty_ || page_id_ == -1 || !webview()) |
Charlie Reis
2014/10/31 21:38:49
Just want to verify that I understand the implicat
Avi (use Gerrit)
2014/10/31 22:11:12
Exactly. This is an intentional change, where we d
|
+ 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; |
} |
void RenderViewImpl::setMouseOverURL(const WebURL& url) { |
@@ -2408,7 +2406,7 @@ void RenderViewImpl::didChangeIcon(WebLocalFrame* frame, |
} |
void RenderViewImpl::didUpdateCurrentHistoryItem(WebLocalFrame* frame) { |
- StartNavStateSyncTimerIfNecessary(); |
+ MarkPageStateAsDirty(); |
} |
void RenderViewImpl::CheckPreferredSize() { |
@@ -2441,7 +2439,7 @@ BrowserPluginManager* RenderViewImpl::GetBrowserPluginManager() { |
} |
void RenderViewImpl::didChangeScrollOffset(WebLocalFrame* frame) { |
- StartNavStateSyncTimerIfNecessary(); |
+ MarkPageStateAsDirty(); |
FOR_EACH_OBSERVER( |
RenderViewObserver, observers_, DidChangeScrollOffset(frame)); |
@@ -2565,8 +2563,8 @@ int RenderViewImpl::GetEnabledBindings() const { |
return enabled_bindings_; |
} |
-bool RenderViewImpl::GetContentStateImmediately() const { |
- return send_content_state_immediately_; |
+bool RenderViewImpl::GetPageStateSentImmediately() const { |
+ return page_state_sent_immediately_; |
} |
blink::WebPageVisibilityState RenderViewImpl::GetVisibilityState() const { |
@@ -2581,10 +2579,8 @@ void RenderViewImpl::DidStopLoading() { |
main_render_frame_->didStopLoading(); |
} |
-void RenderViewImpl::SyncNavigationState() { |
- if (!webview()) |
- return; |
- SendUpdateState(history_controller_->GetCurrentEntry()); |
+void RenderViewImpl::ForcePageStateFlushForTesting() { |
+ FlushPageState(); |
} |
blink::WebPlugin* RenderViewImpl::GetWebPluginForFind() { |