Index: chrome/browser/managed_mode/managed_mode_navigation_observer.cc |
diff --git a/chrome/browser/managed_mode/managed_mode_navigation_observer.cc b/chrome/browser/managed_mode/managed_mode_navigation_observer.cc |
index 91c3ac445fbb95052be8d710802a1584b9f2b91e..2d192f8ff51b1f64a1b8082f0f20426dea7326db 100644 |
--- a/chrome/browser/managed_mode/managed_mode_navigation_observer.cc |
+++ b/chrome/browser/managed_mode/managed_mode_navigation_observer.cc |
@@ -256,6 +256,7 @@ void ManagedModePreviewInfobarDelegate::InfoBarDismissed() { |
DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagedModeNavigationObserver); |
ManagedModeNavigationObserver::~ManagedModeNavigationObserver() { |
+ TabWebContentsTracker::RemoveObserver(this); |
RemoveTemporaryException(); |
} |
@@ -267,6 +268,7 @@ ManagedModeNavigationObserver::ManagedModeNavigationObserver( |
state_(RECORDING_URLS_BEFORE_PREVIEW), |
is_elevated_(false), |
last_allowed_page_(-1), |
+ observer_state_cleared_(false), |
finished_redirects_(false) { |
Profile* profile = |
Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
@@ -274,6 +276,39 @@ ManagedModeNavigationObserver::ManagedModeNavigationObserver( |
if (!managed_user_service_->ProfileIsManaged()) |
is_elevated_ = true; |
url_filter_ = managed_user_service_->GetURLFilterForUIThread(); |
+ TabWebContentsTracker::AddObserver(this); |
+} |
+ |
+void ManagedModeNavigationObserver::OnTabReplacedAt( |
+ TabStripModel* tab_strip_model, |
+ content::WebContents* old_contents, |
+ content::WebContents* new_contents, |
+ int index) { |
+ if (new_contents == web_contents()) { |
Bernhard Bauer
2013/04/26 16:30:10
Early-return otherwise?
|
+ // First, copy over some data of the old navigation observer. This only |
Bernhard Bauer
2013/04/26 16:30:10
This seems...brittle. I'm okay with it, but I coul
Adrian Kuegel
2013/04/29 08:11:15
But if I copy the whole object over, it would stil
Bernhard Bauer
2013/04/29 08:39:38
Like I said, I'm okay with this, I just want to ke
|
+ // applies if the ClearObserverState function was not called on the new |
Adrian Kuegel
2013/04/26 15:52:27
Reassigning the ManagedModeNavigationObserver to a
|
+ // navigation observer, because that would reset the data we are about to |
+ // copy. |
+ if (!observer_state_cleared_) { |
+ ManagedModeNavigationObserver* observer = |
+ ManagedModeNavigationObserver::FromWebContents(old_contents); |
+ navigated_urls_.insert(observer->navigated_urls_.begin(), |
+ observer->navigated_urls_.end()); |
+ if (last_allowed_page_ < 0) |
+ last_allowed_page_ = observer->last_allowed_page_; |
+ if (observer->warn_infobar_delegate_ && !warn_infobar_delegate_) { |
+ warn_infobar_delegate_ = ManagedModeWarningInfobarDelegate::Create( |
+ InfoBarService::FromWebContents(web_contents()), |
+ last_allowed_page_); |
+ } |
+ if (observer->preview_infobar_delegate_ && !preview_infobar_delegate_) { |
+ preview_infobar_delegate_ = ManagedModePreviewInfobarDelegate::Create( |
Bernhard Bauer
2013/04/26 16:30:10
Doesn't InfobarTabHelper or something similar take
Adrian Kuegel
2013/04/29 08:11:15
Yes, that is possible. I guess I can remove that c
|
+ InfoBarService::FromWebContents(web_contents())); |
+ } |
+ // We don't need to copy |state_| and |finished_redirects_|, because that |
+ // should be up-to-date. |
+ } |
+ } |
} |
void ManagedModeNavigationObserver::AddTemporaryException() { |
@@ -387,6 +422,7 @@ void ManagedModeNavigationObserver::ClearObserverState() { |
infobar_service->RemoveInfoBar(preview_infobar_delegate_); |
preview_infobar_delegate_ = NULL; |
} |
+ observer_state_cleared_ = true; |
Bernhard Bauer
2013/04/26 16:30:10
So you set this to true when we have cleared obser
Adrian Kuegel
2013/04/29 08:11:15
Yes, but that is exactly as expected. This variabl
|
navigated_urls_.clear(); |
last_url_ = GURL(); |
state_ = RECORDING_URLS_BEFORE_PREVIEW; |