Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Unified Diff: content/renderer/render_view_impl.cc

Issue 689163002: Clean up the page state saving mechanism. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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() {

Powered by Google App Engine
This is Rietveld 408576698