summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authormmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-20 21:02:57 +0000
committermmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-20 21:02:57 +0000
commitcf5db4cbdfe677e4291cb8c077a472813af418af (patch)
tree3abf801ab00b4dffc67fd9994e7c4fa0c9c32ca9 /chrome
parent970fb675f98ba3f0a243d1f9f0e9ab8b15f7ac45 (diff)
downloadchromium_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.cc21
-rw-r--r--chrome/browser/browsing_data_remover.h19
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc63
-rw-r--r--chrome/browser/prerender/prerender_final_status.cc1
-rw-r--r--chrome/browser/prerender/prerender_final_status.h1
-rw-r--r--chrome/browser/prerender/prerender_history.cc4
-rw-r--r--chrome/browser/prerender/prerender_history.h3
-rw-r--r--chrome/browser/prerender/prerender_history_unittest.cc7
-rw-r--r--chrome/browser/prerender/prerender_manager.cc29
-rw-r--r--chrome/browser/prerender/prerender_manager.h27
-rw-r--r--chrome/browser/prerender/prerender_manager_unittest.cc14
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