diff options
author | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-20 21:02:57 +0000 |
---|---|---|
committer | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-20 21:02:57 +0000 |
commit | cf5db4cbdfe677e4291cb8c077a472813af418af (patch) | |
tree | 3abf801ab00b4dffc67fd9994e7c4fa0c9c32ca9 /chrome | |
parent | 970fb675f98ba3f0a243d1f9f0e9ab8b15f7ac45 (diff) | |
download | chromium_src-cf5db4cbdfe677e4291cb8c077a472813af418af.zip chromium_src-cf5db4cbdfe677e4291cb8c077a472813af418af.tar.gz chromium_src-cf5db4cbdfe677e4291cb8c077a472813af418af.tar.bz2 |
Clear prerender history on clear history.
Also cancel active prerenders on clear history or cache.
BUG=none
TEST=PrerenderManagerTest.ClearTest, PrerenderHistoryTest.GetAsValue, PrerenderBrowserTest.PrerenderClearHistory, PrerenderBrowserTest.PrerenderClearCache
Review URL: http://codereview.chromium.org/7205007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@89729 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/browsing_data_remover.cc | 21 | ||||
-rw-r--r-- | chrome/browser/browsing_data_remover.h | 19 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_browsertest.cc | 63 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_final_status.cc | 1 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_final_status.h | 1 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_history.cc | 4 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_history.h | 3 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_history_unittest.cc | 7 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.cc | 29 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.h | 27 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager_unittest.cc | 14 |
11 files changed, 173 insertions, 16 deletions
diff --git a/chrome/browser/browsing_data_remover.cc b/chrome/browser/browsing_data_remover.cc index 74e294c9..9a42c40 100644 --- a/chrome/browser/browsing_data_remover.cc +++ b/chrome/browser/browsing_data_remover.cc @@ -21,6 +21,7 @@ #include "chrome/browser/net/chrome_url_request_context.h" #include "chrome/browser/password_manager/password_store.h" #include "chrome/browser/plugin_data_remover.h" +#include "chrome/browser/prerender/prerender_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/renderer_host/web_cache_manager.h" #include "chrome/browser/search_engines/template_url_service.h" @@ -173,6 +174,17 @@ void BrowsingDataRemover::Remove(int remove_mask) { SessionServiceFactory::GetForProfile(profile_); if (session_service) session_service->DeleteLastSession(); + + // The PrerenderManager keeps history of prerendered pages, so clear that. + // It also may have a prerendered page. If so, the page could be considered + // to have a small amount of historical information, so delete it, too. + prerender::PrerenderManager* prerender_manager = + profile_->GetPrerenderManager(); + if (prerender_manager) { + prerender_manager->ClearData( + prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS | + prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY); + } } if (remove_mask & REMOVE_DOWNLOADS) { @@ -281,6 +293,15 @@ void BrowsingDataRemover::Remove(int remove_mask) { BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, NewRunnableMethod(this, &BrowsingDataRemover::ClearCacheOnIOThread)); + + // The PrerenderManager may have a page actively being prerendered, which + // is essentially a preemptively cached page. + prerender::PrerenderManager* prerender_manager = + profile_->GetPrerenderManager(); + if (prerender_manager) { + prerender_manager->ClearData( + prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS); + } } if (remove_mask & REMOVE_LSO_DATA) { diff --git a/chrome/browser/browsing_data_remover.h b/chrome/browser/browsing_data_remover.h index 428cb9b..fbfd4ec 100644 --- a/chrome/browser/browsing_data_remover.h +++ b/chrome/browser/browsing_data_remover.h @@ -50,15 +50,16 @@ class BrowsingDataRemover : public NotificationObserver, }; // Mask used for Remove. - - // In addition to visits, this removes keywords and the last session. - static const int REMOVE_HISTORY = 1 << 0; - static const int REMOVE_DOWNLOADS = 1 << 1; - static const int REMOVE_COOKIES = 1 << 2; - static const int REMOVE_PASSWORDS = 1 << 3; - static const int REMOVE_FORM_DATA = 1 << 4; - static const int REMOVE_CACHE = 1 << 5; - static const int REMOVE_LSO_DATA = 1 << 6; + enum RemoveDataMask { + // In addition to visits, this removes keywords and the last session. + REMOVE_HISTORY = 1 << 0, + REMOVE_DOWNLOADS = 1 << 1, + REMOVE_COOKIES = 1 << 2, + REMOVE_PASSWORDS = 1 << 3, + REMOVE_FORM_DATA = 1 << 4, + REMOVE_CACHE = 1 << 5, + REMOVE_LSO_DATA = 1 << 6, + }; // Observer is notified when the removal is done. Done means keywords have // been deleted, cache cleared and all other tasks scheduled. diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index f30a5eb..f1dec03 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc @@ -8,7 +8,9 @@ #include "base/path_service.h" #include "base/string_util.h" #include "base/utf_string_conversions.h" +#include "base/values.h" #include "base/test/test_timeouts.h" +#include "chrome/browser/browsing_data_remover.h" #include "chrome/browser/content_settings/host_content_settings_map.h" #include "chrome/browser/favicon/favicon_tab_helper.h" #include "chrome/browser/prefs/pref_service.h" @@ -58,6 +60,16 @@ std::string CreateServerRedirect(const std::string& dest_url) { return kServerRedirectBase + dest_url; } +// Clears the specified data using BrowsingDataRemover. +void ClearBrowsingData(Browser* browser, int remove_mask) { + BrowsingDataRemover* remover = + new BrowsingDataRemover(browser->profile(), + BrowsingDataRemover::EVERYTHING, + base::Time()); + remover->Remove(remove_mask); + // BrowsingDataRemover deletes itself. +} + // Returns true if and only if the final status is one in which the prerendered // page should prerender correctly. The page still may not be used. bool ShouldRenderPrerenderedPageCorrectly(FinalStatus status) { @@ -65,6 +77,7 @@ bool ShouldRenderPrerenderedPageCorrectly(FinalStatus status) { case FINAL_STATUS_USED: case FINAL_STATUS_WINDOW_OPENER: case FINAL_STATUS_FRAGMENT_MISMATCH: + case FINAL_STATUS_CACHE_OR_HISTORY_CLEARED: // We'll crash the renderer after it's loaded. case FINAL_STATUS_RENDERER_CRASHED: return true; @@ -468,6 +481,18 @@ class PrerenderBrowserTest : public InProcessBrowserTest { return prerender_manager; } + // Returns length of |prerender_manager_|'s history, or -1 on failure. + int GetHistoryLength() const { + scoped_ptr<DictionaryValue> prerender_dict( + static_cast<DictionaryValue*>(prerender_manager()->GetAsValue())); + if (!prerender_dict.get()) + return -1; + ListValue* history_list; + if (!prerender_dict->GetList("history", &history_list)) + return -1; + return static_cast<int>(history_list->GetSize()); + } + FakeSafeBrowsingService* GetSafeBrowsingService() { return safe_browsing_factory_->most_recent_service(); } @@ -1391,4 +1416,42 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderUnload) { EXPECT_TRUE(title_watcher.Wait()); } +// Checks that when the history is cleared, prerendering is cancelled and +// prerendering history is cleared. +// DISABLED: http://www.crbug.com/86829 +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderClearHistory) { + PrerenderTestURL("files/prerender/prerender_page.html", + FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, + 1); + + // Post a task to clear the history, and run the message loop until it + // destroys the prerender. + MessageLoop::current()->PostTask(FROM_HERE, + NewRunnableFunction(ClearBrowsingData, browser(), + BrowsingDataRemover::REMOVE_HISTORY)); + ui_test_utils::RunMessageLoop(); + + // Make sure prerender history was cleared. + EXPECT_EQ(0, GetHistoryLength()); +} + +// Checks that when the cache is cleared, prerenders are cancelled but +// prerendering history is not cleared. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearCache) { + PrerenderTestURL("files/prerender/prerender_page.html", + FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, + 1); + + // Post a task to clear the cache, and run the message loop until it + // destroys the prerender. + MessageLoop::current()->PostTask(FROM_HERE, + NewRunnableFunction(ClearBrowsingData, browser(), + BrowsingDataRemover::REMOVE_CACHE)); + ui_test_utils::RunMessageLoop(); + + // Make sure prerender history was not cleared. Not a vital behavior, but + // used to compare with PrerenderClearHistory test. + EXPECT_EQ(1, GetHistoryLength()); +} + } // namespace prerender diff --git a/chrome/browser/prerender/prerender_final_status.cc b/chrome/browser/prerender/prerender_final_status.cc index 50f57d0..8d71e41 100644 --- a/chrome/browser/prerender/prerender_final_status.cc +++ b/chrome/browser/prerender/prerender_final_status.cc @@ -43,6 +43,7 @@ const char* kFinalStatusNames[] = { "Safe Browsing", "Fragment Mismatch", "SSL Client Certificate Requested", + "Cache or History Cleared", "Max", }; COMPILE_ASSERT(arraysize(kFinalStatusNames) == FINAL_STATUS_MAX + 1, diff --git a/chrome/browser/prerender/prerender_final_status.h b/chrome/browser/prerender/prerender_final_status.h index 79afc23..da9fec8 100644 --- a/chrome/browser/prerender/prerender_final_status.h +++ b/chrome/browser/prerender/prerender_final_status.h @@ -41,6 +41,7 @@ enum FinalStatus { FINAL_STATUS_SAFE_BROWSING = 28, FINAL_STATUS_FRAGMENT_MISMATCH = 29, FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED = 30, + FINAL_STATUS_CACHE_OR_HISTORY_CLEARED = 31, FINAL_STATUS_MAX, }; diff --git a/chrome/browser/prerender/prerender_history.cc b/chrome/browser/prerender/prerender_history.cc index 319af90..1f2e16c 100644 --- a/chrome/browser/prerender/prerender_history.cc +++ b/chrome/browser/prerender/prerender_history.cc @@ -24,6 +24,10 @@ void PrerenderHistory::AddEntry(const Entry& entry) { entries_.push_back(entry); } +void PrerenderHistory::Clear() { + entries_.clear(); +} + Value* PrerenderHistory::GetEntriesAsValue() const { ListValue* return_list = new ListValue(); for (std::list<Entry>::const_reverse_iterator it = entries_.rbegin(); diff --git a/chrome/browser/prerender/prerender_history.h b/chrome/browser/prerender/prerender_history.h index 1754c2b..5bc009f 100644 --- a/chrome/browser/prerender/prerender_history.h +++ b/chrome/browser/prerender/prerender_history.h @@ -47,6 +47,9 @@ class PrerenderHistory : public base::NonThreadSafe { // Adds |entry| to the history. If at capacity, the oldest entry is dropped. void AddEntry(const Entry& entry); + // Deletes all history entries. + void Clear(); + // Retrieves the entries as a value which can be displayed. Value* GetEntriesAsValue() const; diff --git a/chrome/browser/prerender/prerender_history_unittest.cc b/chrome/browser/prerender/prerender_history_unittest.cc index d37e821..f28dde4 100644 --- a/chrome/browser/prerender/prerender_history_unittest.cc +++ b/chrome/browser/prerender/prerender_history_unittest.cc @@ -82,6 +82,13 @@ TEST(PrerenderHistoryTest, GetAsValue) { EXPECT_EQ(2u, entry_list->GetSize()); EXPECT_TRUE(ListEntryMatches(entry_list, 0u, kThirdUrl, kThirdFinalStatus)); EXPECT_TRUE(ListEntryMatches(entry_list, 1u, kSecondUrl, kSecondFinalStatus)); + + // Make sure clearing history acts as expected. + history.Clear(); + entry_value.reset(history.GetEntriesAsValue()); + ASSERT_TRUE(entry_value.get() != NULL); + ASSERT_TRUE(entry_value->GetAsList(&entry_list)); + EXPECT_TRUE(entry_list->empty()); } } // namespace diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc index f4f4a31..9d79e4a 100644 --- a/chrome/browser/prerender/prerender_manager.cc +++ b/chrome/browser/prerender/prerender_manager.cc @@ -10,6 +10,7 @@ #include "base/metrics/field_trial.h" #include "base/metrics/histogram.h" #include "base/time.h" +#include "base/values.h" #include "base/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/favicon/favicon_tab_helper.h" @@ -266,13 +267,7 @@ PrerenderManager::PrerenderManager(Profile* profile, } PrerenderManager::~PrerenderManager() { - DeleteOldTabContents(); - while (!prerender_list_.empty()) { - PrerenderContentsData data = prerender_list_.front(); - prerender_list_.pop_front(); - data.contents_->Destroy(FINAL_STATUS_MANAGER_SHUTDOWN); - } - DeletePendingDeleteEntries(); + DestroyAllContents(FINAL_STATUS_MANAGER_SHUTDOWN); } void PrerenderManager::SetPrerenderContentsFactory( @@ -1001,6 +996,16 @@ Value* PrerenderManager::GetAsValue() const { return dict_value; } +void PrerenderManager::ClearData(int clear_flags) { + DCHECK_GE(clear_flags, 0); + DCHECK_LT(clear_flags, CLEAR_MAX); + if (clear_flags & CLEAR_PRERENDER_CONTENTS) + DestroyAllContents(FINAL_STATUS_CACHE_OR_HISTORY_CLEARED); + // This has to be second, since destroying prerenders can add to the history. + if (clear_flags & CLEAR_PRERENDER_HISTORY) + prerender_history_->Clear(); +} + Value* PrerenderManager::GetActivePrerendersAsValue() const { ListValue* list_value = new ListValue(); for (std::list<PrerenderContentsData>::const_iterator it = @@ -1021,4 +1026,14 @@ void PrerenderManager::AddToHistory(PrerenderContents* contents) { prerender_history_->AddEntry(entry); } +void PrerenderManager::DestroyAllContents(FinalStatus final_status) { + DeleteOldTabContents(); + while (!prerender_list_.empty()) { + PrerenderContentsData data = prerender_list_.front(); + prerender_list_.pop_front(); + data.contents_->Destroy(final_status); + } + DeletePendingDeleteEntries(); +} + } // namespace prerender diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h index 65547d0..96e3090 100644 --- a/chrome/browser/prerender/prerender_manager.h +++ b/chrome/browser/prerender/prerender_manager.h @@ -73,6 +73,14 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, PRERENDER_MODE_MAX }; + // One or more of these flags must be passed to ClearData() to specify just + // what data to clear. See function declaration for more information. + enum ClearFlags { + CLEAR_PRERENDER_CONTENTS = 0x1 << 0, + CLEAR_PRERENDER_HISTORY = 0x1 << 1, + CLEAR_MAX = 0x1 << 2 + }; + // Owned by a Profile object for the lifetime of the profile. PrerenderManager(Profile* profile, PrerenderTracker* prerender_tracker); @@ -195,11 +203,25 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, // deleting the return value. Value* GetAsValue() const; + // Clears the data indicated by which bits of clear_flags are set. + // + // If the CLEAR_PRERENDER_CONTENTS bit is set, all active prerenders are + // cancelled and then deleted, and any TabContents queued for destruction are + // destroyed as well. + // + // If the CLEAR_PRERENDER_HISTORY bit is set, the prerender history is + // cleared, including any entries newly created by destroying them in + // response to the CLEAR_PRERENDER_CONTENTS flag. + // + // Intended to be used when clearing the cache or history. + void ClearData(int clear_flags); + protected: struct PendingContentsData; void SetPrerenderContentsFactory( PrerenderContents::Factory* prerender_contents_factory); + bool rate_limit_enabled_; PendingContentsData* FindPendingEntry(const GURL& url); @@ -292,6 +314,11 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, // caller is responsible for delete'ing the return value. Value* GetActivePrerendersAsValue() const; + // Destroys all pending prerenders using FinalStatus. Also deletes them as + // well as any swapped out TabContents queued for destruction. + // Used both on destruction, and when clearing the browing history. + void DestroyAllContents(FinalStatus final_status); + // Specifies whether prerendering is currently enabled for this // manager. The value can change dynamically during the lifetime // of the PrerenderManager. diff --git a/chrome/browser/prerender/prerender_manager_unittest.cc b/chrome/browser/prerender/prerender_manager_unittest.cc index 9b82c16..63b2a63 100644 --- a/chrome/browser/prerender/prerender_manager_unittest.cc +++ b/chrome/browser/prerender/prerender_manager_unittest.cc @@ -519,4 +519,18 @@ TEST_F(PrerenderManagerTest, FragmentMatchesFragmentTest) { prerender_manager()->GetEntry(other_fragment_url)); } +// Make sure that clearing works as expected. +TEST_F(PrerenderManagerTest, ClearTest) { + GURL url("http://www.google.com/"); + DummyPrerenderContents* prerender_contents = + prerender_manager()->CreateNextPrerenderContents( + url, + FINAL_STATUS_CACHE_OR_HISTORY_CLEARED); + EXPECT_TRUE(prerender_manager()->AddSimplePreload(url)); + EXPECT_TRUE(prerender_contents->has_started()); + prerender_manager()->ClearData(PrerenderManager::CLEAR_PRERENDER_CONTENTS); + DummyPrerenderContents* null = NULL; + EXPECT_EQ(null, prerender_manager()->GetEntry(url)); +} + } // namespace prerender |