summaryrefslogtreecommitdiffstats
path: root/components/offline_pages
diff options
context:
space:
mode:
Diffstat (limited to 'components/offline_pages')
-rw-r--r--components/offline_pages/offline_page_model.cc5
-rw-r--r--components/offline_pages/offline_page_model.h3
-rw-r--r--components/offline_pages/offline_page_model_unittest.cc95
-rw-r--r--components/offline_pages/offline_page_test_store.cc28
-rw-r--r--components/offline_pages/offline_page_test_store.h10
5 files changed, 116 insertions, 25 deletions
diff --git a/components/offline_pages/offline_page_model.cc b/components/offline_pages/offline_page_model.cc
index d0c536a..71102f7 100644
--- a/components/offline_pages/offline_page_model.cc
+++ b/components/offline_pages/offline_page_model.cc
@@ -108,6 +108,11 @@ bool OfflinePageModel::CanSavePage(const GURL& url) {
return url.SchemeIsHTTPOrHTTPS();
}
+// static
+base::TimeDelta OfflinePageModel::GetFinalDeletionDelayForTesting() {
+ return kFinalDeletionDelay;
+}
+
OfflinePageModel::OfflinePageModel(
scoped_ptr<OfflinePageMetadataStore> store,
const base::FilePath& archives_dir,
diff --git a/components/offline_pages/offline_page_model.h b/components/offline_pages/offline_page_model.h
index 631d522..48763f2 100644
--- a/components/offline_pages/offline_page_model.h
+++ b/components/offline_pages/offline_page_model.h
@@ -27,6 +27,7 @@ class GURL;
namespace base {
class SequencedTaskRunner;
class Time;
+class TimeDelta;
}
namespace bookmarks {
class BookmarkModel;
@@ -124,6 +125,8 @@ class OfflinePageModel : public KeyedService,
// Returns true if an offline copy can be saved for the given URL.
static bool CanSavePage(const GURL& url);
+ static base::TimeDelta GetFinalDeletionDelayForTesting();
+
// All blocking calls/disk access will happen on the provided |task_runner|.
OfflinePageModel(scoped_ptr<OfflinePageMetadataStore> store,
const base::FilePath& archives_dir,
diff --git a/components/offline_pages/offline_page_model_unittest.cc b/components/offline_pages/offline_page_model_unittest.cc
index f1f817b..24d9bce 100644
--- a/components/offline_pages/offline_page_model_unittest.cc
+++ b/components/offline_pages/offline_page_model_unittest.cc
@@ -78,6 +78,9 @@ class OfflinePageModelTest
// Runs until all of the tasks that are not delayed are gone from the task
// queue.
void PumpLoop();
+ // Fast-forwards virtual time by |delta|, causing tasks with a remaining
+ // delay less than or equal to |delta| to be executed.
+ void FastForwardBy(base::TimeDelta delta);
void ResetResults();
OfflinePageModel* model() { return model_.get(); }
@@ -198,6 +201,10 @@ void OfflinePageModelTest::PumpLoop() {
task_runner_->RunUntilIdle();
}
+void OfflinePageModelTest::FastForwardBy(base::TimeDelta delta) {
+ task_runner_->FastForwardBy(delta);
+}
+
void OfflinePageModelTest::ResetResults() {
last_save_result_ = SavePageResult::CANCELLED;
last_delete_result_ = DeletePageResult::CANCELLED;
@@ -450,6 +457,30 @@ TEST_F(OfflinePageModelTest, MarkPageForDeletion) {
EXPECT_EQ(1UL, offline_pages_after_undo.size());
}
+TEST_F(OfflinePageModelTest, FinalizePageDeletion) {
+ scoped_ptr<OfflinePageTestArchiver> archiver(
+ BuildArchiver(kTestUrl,
+ OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)
+ .Pass());
+ model()->SavePage(
+ kTestUrl, kTestPageBookmarkId1, archiver.Pass(),
+ base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
+ PumpLoop();
+
+ // Mark the page for deletion.
+ model()->MarkPageForDeletion(
+ kTestPageBookmarkId1,
+ base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
+ PumpLoop();
+
+ EXPECT_EQ(1UL, GetStore()->GetAllPages().size());
+
+ // Fast forward to trigger the page deletion.
+ FastForwardBy(OfflinePageModel::GetFinalDeletionDelayForTesting());
+
+ EXPECT_EQ(0UL, GetStore()->GetAllPages().size());
+}
+
TEST_F(OfflinePageModelTest, GetAllPagesStoreEmpty) {
const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages();
@@ -478,7 +509,7 @@ TEST_F(OfflinePageModelTest, DeletePageSuccessful) {
PumpLoop();
EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
- EXPECT_EQ(1u, store->offline_pages().size());
+ EXPECT_EQ(1u, store->GetAllPages().size());
ResetResults();
@@ -493,7 +524,7 @@ TEST_F(OfflinePageModelTest, DeletePageSuccessful) {
PumpLoop();
EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
- EXPECT_EQ(2u, store->offline_pages().size());
+ EXPECT_EQ(2u, store->GetAllPages().size());
ResetResults();
@@ -506,8 +537,8 @@ TEST_F(OfflinePageModelTest, DeletePageSuccessful) {
EXPECT_EQ(last_deleted_bookmark_id(), kTestPageBookmarkId1);
EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
- ASSERT_EQ(1u, store->offline_pages().size());
- EXPECT_EQ(kTestUrl2, store->offline_pages()[0].url);
+ ASSERT_EQ(1u, store->GetAllPages().size());
+ EXPECT_EQ(kTestUrl2, store->GetAllPages()[0].url);
// Delete another page.
model()->DeletePageByBookmarkId(
@@ -520,7 +551,7 @@ TEST_F(OfflinePageModelTest, DeletePageSuccessful) {
EXPECT_EQ(last_deleted_bookmark_id(), kTestPageBookmarkId2);
EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
- EXPECT_EQ(0u, store->offline_pages().size());
+ EXPECT_EQ(0u, store->GetAllPages().size());
}
TEST_F(OfflinePageModelTest, DeletePageNotFound) {
@@ -602,6 +633,54 @@ TEST_F(OfflinePageModelTest, DetectThatOfflineCopyIsMissingAfterLoad) {
EXPECT_EQ(0UL, model()->GetAllPages().size());
}
+TEST_F(OfflinePageModelTest, DeleteMultiplePages) {
+ OfflinePageTestStore* store = GetStore();
+
+ // Save 3 pages.
+ scoped_ptr<OfflinePageTestArchiver> archiver(
+ BuildArchiver(kTestUrl,
+ OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)
+ .Pass());
+ model()->SavePage(
+ kTestUrl, kTestPageBookmarkId1, archiver.Pass(),
+ base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
+ PumpLoop();
+
+ scoped_ptr<OfflinePageTestArchiver> archiver2(
+ BuildArchiver(kTestUrl2,
+ OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)
+ .Pass());
+ model()->SavePage(
+ kTestUrl2, kTestPageBookmarkId2, archiver2.Pass(),
+ base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
+ PumpLoop();
+
+ scoped_ptr<OfflinePageTestArchiver> archiver3(
+ BuildArchiver(kTestUrl3,
+ OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)
+ .Pass());
+ model()->SavePage(
+ kTestUrl3, kTestPageBookmarkId3, archiver3.Pass(),
+ base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
+ PumpLoop();
+
+ EXPECT_EQ(3u, store->GetAllPages().size());
+
+ // Delete multiple pages.
+ std::vector<int64> ids_to_delete;
+ ids_to_delete.push_back(kTestPageBookmarkId2);
+ ids_to_delete.push_back(kTestPageBookmarkId1);
+ ids_to_delete.push_back(23434LL); // Non-existent ID.
+ model()->DeletePagesByBookmarkId(
+ ids_to_delete, base::Bind(&OfflinePageModelTest::OnDeletePageDone,
+ AsWeakPtr()));
+ PumpLoop();
+
+ // Success is expected if at least one page is deleted successfully.
+ EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
+ EXPECT_EQ(1u, store->GetAllPages().size());
+}
+
TEST_F(OfflinePageModelTest, GetPageByBookmarkId) {
scoped_ptr<OfflinePageTestArchiver> archiver(
BuildArchiver(kTestUrl,
@@ -790,7 +869,7 @@ TEST_F(OfflinePageModelTest, ClearAll) {
const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages();
EXPECT_EQ(2UL, offline_pages.size());
- EXPECT_EQ(2UL, GetStore()->offline_pages().size());
+ EXPECT_EQ(2UL, GetStore()->GetAllPages().size());
base::FilePath archiver_path = offline_pages[0].file_path;
EXPECT_TRUE(base::PathExists(archiver_path));
@@ -799,7 +878,7 @@ TEST_F(OfflinePageModelTest, ClearAll) {
base::Bind(&OfflinePageModelTest::OnClearAllDone, AsWeakPtr()));
PumpLoop();
EXPECT_EQ(0UL, model()->GetAllPages().size());
- EXPECT_EQ(0UL, GetStore()->offline_pages().size());
+ EXPECT_EQ(0UL, GetStore()->GetAllPages().size());
EXPECT_FALSE(base::PathExists(archiver_path));
// The model should reload the store after the reset. All model operations
@@ -813,7 +892,7 @@ TEST_F(OfflinePageModelTest, ClearAll) {
base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
PumpLoop();
EXPECT_EQ(1UL, model()->GetAllPages().size());
- EXPECT_EQ(1UL, GetStore()->offline_pages().size());
+ EXPECT_EQ(1UL, GetStore()->GetAllPages().size());
}
TEST_F(OfflinePageModelTest, BookmarkNodeChangesUrl) {
diff --git a/components/offline_pages/offline_page_test_store.cc b/components/offline_pages/offline_page_test_store.cc
index 3a5b256..755191c 100644
--- a/components/offline_pages/offline_page_test_store.cc
+++ b/components/offline_pages/offline_page_test_store.cc
@@ -31,7 +31,7 @@ void OfflinePageTestStore::Load(const LoadCallback& callback) {
load_status = OfflinePageMetadataStore::LOAD_SUCCEEDED;
}
task_runner_->PostTask(FROM_HERE,
- base::Bind(callback, load_status, offline_pages_));
+ base::Bind(callback, load_status, GetAllPages()));
}
void OfflinePageTestStore::AddOrUpdateOfflinePage(
@@ -40,7 +40,7 @@ void OfflinePageTestStore::AddOrUpdateOfflinePage(
last_saved_page_ = offline_page;
bool result = scenario_ != TestScenario::WRITE_FAILED;
if (result)
- offline_pages_.push_back(offline_page);
+ offline_pages_[offline_page.bookmark_id] = offline_page;
task_runner_->PostTask(FROM_HERE, base::Bind(callback, result));
}
@@ -50,12 +50,11 @@ void OfflinePageTestStore::RemoveOfflinePages(
ASSERT_FALSE(bookmark_ids.empty());
bool result = false;
if (scenario_ != TestScenario::REMOVE_FAILED) {
- for (auto iter = offline_pages_.begin(); iter != offline_pages_.end();
- ++iter) {
- if (iter->bookmark_id == bookmark_ids[0]) {
+ for (const auto& bookmark_id : bookmark_ids) {
+ auto iter = offline_pages_.find(bookmark_id);
+ if (iter != offline_pages_.end()) {
offline_pages_.erase(iter);
result = true;
- break;
}
}
}
@@ -71,12 +70,17 @@ void OfflinePageTestStore::Reset(const ResetCallback& callback) {
void OfflinePageTestStore::UpdateLastAccessTime(
int64 bookmark_id,
const base::Time& last_access_time) {
- for (auto& offline_page : offline_pages_) {
- if (offline_page.bookmark_id == bookmark_id) {
- offline_page.last_access_time = last_access_time;
- return;
- }
- }
+ auto iter = offline_pages_.find(bookmark_id);
+ if (iter == offline_pages_.end())
+ return;
+ iter->second.last_access_time = last_access_time;
+}
+
+std::vector<OfflinePageItem> OfflinePageTestStore::GetAllPages() const {
+ std::vector<OfflinePageItem> offline_pages;
+ for (const auto& id_page_pair : offline_pages_)
+ offline_pages.push_back(id_page_pair.second);
+ return offline_pages;
}
} // namespace offline_pages
diff --git a/components/offline_pages/offline_page_test_store.h b/components/offline_pages/offline_page_test_store.h
index f24ac3c..84a0eea 100644
--- a/components/offline_pages/offline_page_test_store.h
+++ b/components/offline_pages/offline_page_test_store.h
@@ -5,6 +5,7 @@
#ifndef COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_TEST_STORE_H_
#define COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_TEST_STORE_H_
+#include <map>
#include <vector>
#include "base/macros.h"
@@ -43,20 +44,19 @@ class OfflinePageTestStore : public OfflinePageMetadataStore {
void UpdateLastAccessTime(int64 bookmark_id,
const base::Time& last_access_time);
+ // Returns all pages, regardless their states.
+ std::vector<OfflinePageItem> GetAllPages() const;
+
const OfflinePageItem& last_saved_page() const { return last_saved_page_; }
void set_test_scenario(TestScenario scenario) { scenario_ = scenario; };
- const std::vector<OfflinePageItem>& offline_pages() const {
- return offline_pages_;
- }
-
private:
OfflinePageItem last_saved_page_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
TestScenario scenario_;
- std::vector<OfflinePageItem> offline_pages_;
+ std::map<int64, OfflinePageItem> offline_pages_;
DISALLOW_ASSIGN(OfflinePageTestStore);
};