summaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-25 00:15:01 +0000
committerboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-25 00:15:01 +0000
commitbff706b5af5185a8f97e7046ca437a9ab4c1fc3c (patch)
tree96c43d0f1a684c56d3fd327ff41afa83da1f1674 /components
parentb1567305444991386730089f15fcfe04665f4796 (diff)
downloadchromium_src-bff706b5af5185a8f97e7046ca437a9ab4c1fc3c.zip
chromium_src-bff706b5af5185a8f97e7046ca437a9ab4c1fc3c.tar.gz
chromium_src-bff706b5af5185a8f97e7046ca437a9ab4c1fc3c.tar.bz2
Add VisitedLink option to not persist to disk.
This is for Android WebView where persistence of VisitedLink database is handled by the app embedding the WebView. Added bool parameter to VisitedLinkMaster constructors. In VisitedLinkMaster, check this option before every method call to access the file, and add DCHECKs inside the disk io methods themselves. BUG= Review URL: https://chromiumcodereview.appspot.com/11884034 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@178705 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components')
-rw-r--r--components/visitedlink/browser/visitedlink_master.cc56
-rw-r--r--components/visitedlink/browser/visitedlink_master.h21
-rw-r--r--components/visitedlink/test/visitedlink_perftest.cc6
-rw-r--r--components/visitedlink/test/visitedlink_unittest.cc3
4 files changed, 59 insertions, 27 deletions
diff --git a/components/visitedlink/browser/visitedlink_master.cc b/components/visitedlink/browser/visitedlink_master.cc
index 3205bcf..8981c51 100644
--- a/components/visitedlink/browser/visitedlink_master.cc
+++ b/components/visitedlink/browser/visitedlink_master.cc
@@ -180,21 +180,25 @@ class VisitedLinkMaster::TableBuilder
// VisitedLinkMaster ----------------------------------------------------------
VisitedLinkMaster::VisitedLinkMaster(content::BrowserContext* browser_context,
- VisitedLinkDelegate* delegate)
+ VisitedLinkDelegate* delegate,
+ bool persist_to_disk)
: browser_context_(browser_context),
delegate_(delegate),
listener_(new VisitedLinkEventListener(
- ALLOW_THIS_IN_INITIALIZER_LIST(this), browser_context)) {
+ ALLOW_THIS_IN_INITIALIZER_LIST(this), browser_context)),
+ persist_to_disk_(persist_to_disk) {
InitMembers();
}
VisitedLinkMaster::VisitedLinkMaster(Listener* listener,
VisitedLinkDelegate* delegate,
+ bool persist_to_disk,
bool suppress_rebuild,
const FilePath& filename,
int32 default_table_size)
: browser_context_(NULL),
- delegate_(delegate) {
+ delegate_(delegate),
+ persist_to_disk_(persist_to_disk) {
listener_.reset(listener);
DCHECK(listener_.get());
InitMembers();
@@ -236,9 +240,12 @@ bool VisitedLinkMaster::Init() {
// but it does need to happen early on in startup.
// http://code.google.com/p/chromium/issues/detail?id=24163
base::ThreadRestrictions::ScopedAllowIO allow_io;
- if (!InitFromFile())
- return InitFromScratch(suppress_rebuild_);
- return true;
+
+ if (persist_to_disk_) {
+ if (InitFromFile())
+ return true;
+ }
+ return InitFromScratch(suppress_rebuild_);
}
VisitedLinkMaster::Hash VisitedLinkMaster::TryToAddURL(const GURL& url) {
@@ -280,6 +287,7 @@ VisitedLinkMaster::Hash VisitedLinkMaster::TryToAddURL(const GURL& url) {
void VisitedLinkMaster::PostIOTask(const tracked_objects::Location& from_here,
const base::Closure& task) {
+ DCHECK(persist_to_disk_);
BrowserThread::GetBlockingPool()->PostSequencedWorkerTask(sequence_token_,
from_here, task);
}
@@ -288,8 +296,10 @@ void VisitedLinkMaster::AddURL(const GURL& url) {
Hash index = TryToAddURL(url);
if (!table_builder_ && index != null_hash_) {
// Not rebuilding, so we want to keep the file on disk up-to-date.
- WriteUsedItemCountToFile();
- WriteHashRangeToFile(index, index);
+ if (persist_to_disk_) {
+ WriteUsedItemCountToFile();
+ WriteHashRangeToFile(index, index);
+ }
ResizeTableIfNecessary();
}
}
@@ -303,7 +313,7 @@ void VisitedLinkMaster::AddURLs(const std::vector<GURL>& url) {
}
// Keeps the file on disk up-to-date.
- if (!table_builder_)
+ if (!table_builder_ && persist_to_disk_)
WriteFullTable();
}
@@ -318,7 +328,7 @@ void VisitedLinkMaster::DeleteAllURLs() {
// Resize it if it is now too empty. Resize may write the new table out for
// us, otherwise, schedule writing the new table to disk ourselves.
- if (!ResizeTableIfNecessary())
+ if (!ResizeTableIfNecessary() && persist_to_disk_)
WriteFullTable();
listener_->Reset();
@@ -424,7 +434,7 @@ void VisitedLinkMaster::DeleteFingerprintsFromCurrentTable(
return; // The resize function wrote the new table to disk for us.
// Nobody wrote this out for us, write the full file to disk.
- if (bulk_write)
+ if (bulk_write && persist_to_disk_)
WriteFullTable();
}
@@ -439,7 +449,7 @@ bool VisitedLinkMaster::DeleteFingerprint(Fingerprint fingerprint,
// First update the header used count.
used_items_--;
- if (update_file)
+ if (update_file && persist_to_disk_)
WriteUsedItemCountToFile();
Hash deleted_hash = HashFingerprint(fingerprint);
@@ -483,7 +493,7 @@ bool VisitedLinkMaster::DeleteFingerprint(Fingerprint fingerprint,
}
// Write the affected range to disk [deleted_hash, end_range].
- if (update_file)
+ if (update_file && persist_to_disk_)
WriteHashRangeToFile(deleted_hash, end_range);
return true;
@@ -502,6 +512,8 @@ void VisitedLinkMaster::WriteFullTable() {
// We should pick up the most common types of these failures when we notice
// that the file size is different when we load it back in, and then we will
// regenerate the table.
+ DCHECK(persist_to_disk_);
+
if (!file_) {
file_ = static_cast<FILE**>(calloc(1, sizeof(*file_)));
FilePath filename;
@@ -528,6 +540,7 @@ void VisitedLinkMaster::WriteFullTable() {
bool VisitedLinkMaster::InitFromFile() {
DCHECK(file_ == NULL);
+ DCHECK(persist_to_disk_);
FilePath filename;
GetDatabaseFileName(&filename);
@@ -573,7 +586,7 @@ bool VisitedLinkMaster::InitFromScratch(bool suppress_rebuild) {
DebugValidate();
#endif
- if (suppress_rebuild) {
+ if (suppress_rebuild && persist_to_disk_) {
// When we disallow rebuilds (normally just unit tests), just use the
// current empty table.
WriteFullTable();
@@ -592,6 +605,8 @@ bool VisitedLinkMaster::ReadFileHeader(FILE* file,
int32* num_entries,
int32* used_count,
uint8 salt[LINK_SALT_LENGTH]) {
+ DCHECK(persist_to_disk_);
+
// Get file size.
// Note that there is no need to seek back to the original location in the
// file since ReadFromFile() [which is the next call accessing the file]
@@ -712,7 +727,7 @@ void VisitedLinkMaster::FreeURLTable() {
delete shared_memory_;
shared_memory_ = NULL;
}
- if (!file_)
+ if (!persist_to_disk_ || !file_)
return;
PostIOTask(FROM_HERE, base::Bind(&AsyncClose, file_));
// AsyncClose() will close the file and free the memory pointed by |file_|.
@@ -778,7 +793,8 @@ void VisitedLinkMaster::ResizeTable(int32 new_size) {
#endif
// The new table needs to be written to disk.
- WriteFullTable();
+ if (persist_to_disk_)
+ WriteFullTable();
}
uint32 VisitedLinkMaster::NewTableSizeForCount(int32 item_count) const {
@@ -859,7 +875,8 @@ void VisitedLinkMaster::OnTableRebuildComplete(
// Send an update notification to all child processes.
listener_->NewTable(shared_memory_);
- WriteFullTable();
+ if (persist_to_disk_)
+ WriteFullTable();
}
}
table_builder_ = NULL; // Will release our reference to the builder.
@@ -875,6 +892,7 @@ void VisitedLinkMaster::WriteToFile(FILE** file,
off_t offset,
void* data,
int32 data_size) {
+ DCHECK(persist_to_disk_);
#ifndef NDEBUG
posted_asynchronous_operation_ = true;
#endif
@@ -884,12 +902,15 @@ void VisitedLinkMaster::WriteToFile(FILE** file,
}
void VisitedLinkMaster::WriteUsedItemCountToFile() {
+ DCHECK(persist_to_disk_);
if (!file_)
return; // See comment on the file_ variable for why this might happen.
WriteToFile(file_, kFileHeaderUsedOffset, &used_items_, sizeof(used_items_));
}
void VisitedLinkMaster::WriteHashRangeToFile(Hash first_hash, Hash last_hash) {
+ DCHECK(persist_to_disk_);
+
if (!file_)
return; // See comment on the file_ variable for why this might happen.
if (last_hash < first_hash) {
@@ -913,6 +934,7 @@ bool VisitedLinkMaster::ReadFromFile(FILE* file,
off_t offset,
void* data,
size_t data_size) {
+ DCHECK(persist_to_disk_);
#ifndef NDEBUG
// Since this function is synchronous, we require that no asynchronous
// operations could possibly be pending.
diff --git a/components/visitedlink/browser/visitedlink_master.h b/components/visitedlink/browser/visitedlink_master.h
index eb8262c..072bbfe 100644
--- a/components/visitedlink/browser/visitedlink_master.h
+++ b/components/visitedlink/browser/visitedlink_master.h
@@ -61,7 +61,8 @@ class VisitedLinkMaster : public VisitedLinkCommon {
};
VisitedLinkMaster(content::BrowserContext* browser_context,
- VisitedLinkDelegate* delegate);
+ VisitedLinkDelegate* delegate,
+ bool persist_to_disk);
// In unit test mode, we allow the caller to optionally specify the database
// filename so that it can be run from a unit test. The directory where this
@@ -80,6 +81,7 @@ class VisitedLinkMaster : public VisitedLinkCommon {
// testing except when you want to test the rebuild process explicitly.
VisitedLinkMaster(Listener* listener,
VisitedLinkDelegate* delegate,
+ bool persist_to_disk,
bool suppress_rebuild,
const FilePath& filename,
int32 default_table_size);
@@ -195,6 +197,7 @@ class VisitedLinkMaster : public VisitedLinkCommon {
// File I/O functions
// ------------------
+ // These functions are only called if |persist_to_disk_| is true.
// Posts the given task to the blocking worker pool with our options.
void PostIOTask(const tracked_objects::Location& from_here,
@@ -373,16 +376,20 @@ class VisitedLinkMaster : public VisitedLinkCommon {
// std::vector<Fingerprint> removed_since_rebuild_;
// The currently open file with the table in it. This may be NULL if we're
- // rebuilding and haven't written a new version yet. Writing to the file may
- // be safely ignored in this case. Also |file_| may be non-NULL but point to
- // a NULL pointer. That would mean that opening of the file is already
- // scheduled in a background thread and any writing to the file can also be
- // scheduled to the background thread as it's guaranteed to be executed after
- // the opening.
+ // rebuilding and haven't written a new version yet or if |persist_to_disk_|
+ // is false. Writing to the file may be safely ignored in this case. Also
+ // |file_| may be non-NULL but point to a NULL pointer. That would mean that
+ // opening of the file is already scheduled in a background thread and any
+ // writing to the file can also be scheduled to the background thread as it's
+ // guaranteed to be executed after the opening.
// The class owns both the |file_| pointer and the pointer pointed
// by |*file_|.
FILE** file_;
+ // If true, will try to persist the hash table to disk. Will rebuild from
+ // VisitedLinkDelegate::RebuildTable if there are disk corruptions.
+ bool persist_to_disk_;
+
// Shared memory consists of a SharedHeader followed by the table.
base::SharedMemory *shared_memory_;
diff --git a/components/visitedlink/test/visitedlink_perftest.cc b/components/visitedlink/test/visitedlink_perftest.cc
index 68b250c..ae09967e 100644
--- a/components/visitedlink/test/visitedlink_perftest.cc
+++ b/components/visitedlink/test/visitedlink_perftest.cc
@@ -85,7 +85,7 @@ class VisitedLink : public testing::Test {
TEST_F(VisitedLink, TestAddAndQuery) {
// init
VisitedLinkMaster master(DummyVisitedLinkEventListener::GetInstance(),
- NULL, true, db_path_, 0);
+ NULL, true, true, db_path_, 0);
ASSERT_TRUE(master.Init());
PerfTimeLogger timer("Visited_link_add_and_query");
@@ -116,7 +116,7 @@ TEST_F(VisitedLink, TestLoad) {
PerfTimeLogger table_initialization_timer("Table_initialization");
VisitedLinkMaster master(DummyVisitedLinkEventListener::GetInstance(),
- NULL, true, db_path_, 0);
+ NULL, true, true, db_path_, 0);
// time init with empty table
PerfTimeLogger initTimer("Empty_visited_link_init");
@@ -156,6 +156,7 @@ TEST_F(VisitedLink, TestLoad) {
VisitedLinkMaster master(DummyVisitedLinkEventListener::GetInstance(),
NULL,
true,
+ true,
db_path_,
0);
bool success = master.Init();
@@ -172,6 +173,7 @@ TEST_F(VisitedLink, TestLoad) {
VisitedLinkMaster master(DummyVisitedLinkEventListener::GetInstance(),
NULL,
true,
+ true,
db_path_,
0);
bool success = master.Init();
diff --git a/components/visitedlink/test/visitedlink_unittest.cc b/components/visitedlink/test/visitedlink_unittest.cc
index ef1851f..a20ea88 100644
--- a/components/visitedlink/test/visitedlink_unittest.cc
+++ b/components/visitedlink/test/visitedlink_unittest.cc
@@ -149,6 +149,7 @@ class VisitedLinkTest : public testing::Test {
// Initialize the visited link system.
master_.reset(new VisitedLinkMaster(new TrackingVisitedLinkEventListener(),
&delegate_,
+ true,
suppress_rebuild, visited_file_,
initial_size));
return master_->Init();
@@ -601,7 +602,7 @@ class VisitedLinkEventsTest : public ChromeRenderViewHostTestHarness {
virtual ~VisitedLinkEventsTest() {}
virtual void SetUp() {
browser_context_.reset(new VisitCountingProfile());
- master_.reset(new VisitedLinkMaster(profile(), &delegate_));
+ master_.reset(new VisitedLinkMaster(profile(), &delegate_, true));
master_->Init();
SetRenderProcessHostFactory(&vc_rph_factory_);
content::RenderViewHostTestHarness::SetUp();