Commit da26b6aa authored by Peiyong Lin's avatar Peiyong Lin Committed by Commit Bot

[SessionRestore] Ignore WebContents that are not managed by TabLoader.

PageSignalReceiver dispatches page signals to every PageSignalObserver with
WebContents, thus, TabLoader will be notified with WebContents that is not
managed by TabLoader, causing crash when TabLoader tries to remove it from
notification registrar. This patch adds check inside OnPageAlmostIdle to ignore
WebContents that is not managed by TabLoader, as well as a unit test.

BUG=788744

Change-Id: If19d3b3ee9d73b932644c0574dc3b381eba3f232
Reviewed-on: https://chromium-review.googlesource.com/801655
Commit-Queue: lpy <lpy@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarZhen Wang <zhenw@chromium.org>
Cr-Commit-Position: refs/heads/master@{#520706}
parent 90348029
......@@ -63,7 +63,13 @@ void TabLoader::Observe(int type,
}
void TabLoader::OnPageAlmostIdle(content::WebContents* web_contents) {
HandleTabClosedOrLoaded(&web_contents->GetController());
auto* controller = &web_contents->GetController();
// The |web_contents| is not managed by TabLoader.
if (tabs_loading_.find(controller) == tabs_loading_.end() &&
!base::ContainsValue(tabs_to_load_, controller)) {
return;
}
HandleTabClosedOrLoaded(controller);
}
void TabLoader::SetTabLoadingEnabled(bool enable_tab_loading) {
......
......@@ -90,4 +90,13 @@ TEST_F(TabLoaderTest, UsePageAlmostIdleSignal) {
EXPECT_TRUE(TabLoader::shared_tab_loader_->loading_enabled_);
EXPECT_EQ(1u, TabLoader::shared_tab_loader_->tabs_loading_.size());
EXPECT_EQ(0u, TabLoader::shared_tab_loader_->tabs_to_load_.size());
// |web_contents3| is not managed by TabLoader, thus it's ignored, and
// shouldn't cause loading state change or crash.
content::WebContents* web_contents3 =
test_web_contents_factory_->CreateWebContents(&testing_profile_);
TabLoader::shared_tab_loader_->OnPageAlmostIdle(web_contents3);
EXPECT_TRUE(TabLoader::shared_tab_loader_->loading_enabled_);
EXPECT_EQ(1u, TabLoader::shared_tab_loader_->tabs_loading_.size());
EXPECT_EQ(0u, TabLoader::shared_tab_loader_->tabs_to_load_.size());
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment