Index: chrome/browser/ui/webui/offline_internals_ui.cc |
diff --git a/chrome/browser/ui/webui/offline_internals_ui.cc b/chrome/browser/ui/webui/offline_internals_ui.cc |
index f2515bdae3295fc8325ab4810713521c741d2171..d045a270b4e2408816aaa332f67ca1db1007fed9 100644 |
--- a/chrome/browser/ui/webui/offline_internals_ui.cc |
+++ b/chrome/browser/ui/webui/offline_internals_ui.cc |
@@ -4,14 +4,22 @@ |
#include "chrome/browser/ui/webui/offline_internals_ui.h" |
-#include <string> |
+#include <stdint.h> |
+#include <stdlib.h> |
+#include <vector> |
#include "base/bind.h" |
#include "base/macros.h" |
#include "base/memory/weak_ptr.h" |
+#include "base/strings/string_number_conversions.h" |
#include "base/values.h" |
+#include "chrome/browser/android/offline_pages/offline_page_model_factory.h" |
+#include "chrome/browser/android/offline_pages/request_coordinator_factory.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/common/url_constants.h" |
+#include "components/offline_pages/background/request_coordinator.h" |
+#include "components/offline_pages/background/save_page_request.h" |
+#include "components/offline_pages/offline_page_model.h" |
#include "content/public/browser/web_ui.h" |
#include "content/public/browser/web_ui_controller.h" |
#include "content/public/browser/web_ui_data_source.h" |
@@ -36,8 +44,40 @@ class OfflineInternalsUIMessageHandler : public content::WebUIMessageHandler { |
// Delete selected list of page ids from the store. |
void HandleDeleteSelectedPages(const base::ListValue* args); |
- // Load all information. |
- void HandleGetOfflineInternalsInfo(const base::ListValue* args); |
+ // Load Request Queue info. |
+ void HandleGetRequestQueueInfo(const base::ListValue* args); |
+ |
+ // Load Stored pages info. |
+ void HandleGetStoredPagesInfo(const base::ListValue* args); |
+ |
+ // Callback for async GetAllPages calls. |
+ void HandleStoredPagesCallback( |
+ std::string callback_id, |
+ const offline_pages::MultipleOfflinePageItemResult& pages); |
+ |
+ // Callback for async GetRequests calls. |
+ void HandleRequestQueueCallback( |
+ std::string callback_id, |
+ offline_pages::RequestQueue::GetRequestsResult result, |
+ const std::vector<offline_pages::SavePageRequest>& requests); |
+ |
+ // Callback for DeletePage/ClearAll calls. |
+ void HandleDeletedPagesCallback(std::string callback_id, |
+ const offline_pages::DeletePageResult result); |
+ |
+ // Turns a DeletePageResult enum into logical string. |
+ std::string GetStringFromDeletePageResult( |
+ offline_pages::DeletePageResult value); |
+ |
+ // Turns a SavePageRequest::Status into logical string. |
+ std::string GetStringFromSavePageStatus( |
+ offline_pages::SavePageRequest::Status status); |
+ |
+ // Offline page model to call methods on. |
+ offline_pages::OfflinePageModel* offline_page_model_; |
Dan Beam
2016/06/14 15:43:37
this should be initialized to nullptr
chili
2016/06/14 17:25:43
Done.
|
+ |
+ // Request coordinator for background offline actions. |
+ offline_pages::RequestCoordinator* request_coordinator_; |
Dan Beam
2016/06/14 15:43:37
this should be initialized to nullptr
chili
2016/06/14 17:25:43
Done.
|
// Factory for creating references in callbacks. |
base::WeakPtrFactory<OfflineInternalsUIMessageHandler> weak_ptr_factory_; |
@@ -50,39 +90,163 @@ OfflineInternalsUIMessageHandler::OfflineInternalsUIMessageHandler() |
OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {} |
+std::string OfflineInternalsUIMessageHandler::GetStringFromDeletePageResult( |
+ offline_pages::DeletePageResult value) { |
+ switch (value) { |
+ case offline_pages::DeletePageResult::SUCCESS: |
+ return "Success"; |
+ case offline_pages::DeletePageResult::CANCELLED: |
+ return "Cancelled"; |
+ case offline_pages::DeletePageResult::STORE_FAILURE: |
+ return "Store failure"; |
+ case offline_pages::DeletePageResult::DEVICE_FAILURE: |
+ return "Device failure"; |
+ case offline_pages::DeletePageResult::NOT_FOUND: |
+ return "Not found"; |
+ case offline_pages::DeletePageResult::RESULT_COUNT: |
+ NOTREACHED(); |
+ return "Moooooooo"; // Cows, because why not. |
Dan Beam
2016/06/14 15:43:37
nit: just put a break; here and fall through to th
chili
2016/06/14 17:25:43
Done.
|
+ } |
+ NOTREACHED(); |
+ return "Unknown"; |
+} |
+ |
+std::string OfflineInternalsUIMessageHandler::GetStringFromSavePageStatus( |
+ offline_pages::SavePageRequest::Status status) { |
+ switch (status) { |
+ case offline_pages::SavePageRequest::Status::NOT_READY: |
+ return "Not ready"; |
+ case offline_pages::SavePageRequest::Status::PENDING: |
+ return "Pending"; |
+ case offline_pages::SavePageRequest::Status::STARTED: |
+ return "Started"; |
+ case offline_pages::SavePageRequest::Status::FAILED: |
+ return "Failed"; |
+ case offline_pages::SavePageRequest::Status::EXPIRED: |
+ return "Expired"; |
+ } |
+ NOTREACHED(); |
+ return "Unknown"; |
+} |
+ |
void OfflineInternalsUIMessageHandler::HandleDeleteAllPages( |
const base::ListValue* args) { |
- const base::Value* callback_id; |
- args->Get(0, &callback_id); |
- CallJavascriptFunction("cr.webUIResponse", |
- *callback_id, |
- base::FundamentalValue(true), |
- base::StringValue("success")); |
+ std::string callback_id; |
+ CHECK(args->GetString(0, &callback_id)); |
+ |
+ // Pass back success because ClearAll doesn't return a status. |
+ offline_page_model_->ClearAll( |
+ base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback, |
+ weak_ptr_factory_.GetWeakPtr(), callback_id, |
+ offline_pages::DeletePageResult::SUCCESS)); |
} |
void OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages( |
const base::ListValue* args) { |
- const base::Value* callback_id; |
- args->Get(0, &callback_id); |
- CallJavascriptFunction("cr.webUIResponse", |
- *callback_id, |
- base::FundamentalValue(true), |
- base::StringValue("success")); |
+ std::string callback_id; |
+ CHECK(args->GetString(0, &callback_id)); |
+ |
+ std::vector<int64_t> offline_ids; |
+ const base::ListValue* offline_ids_from_arg; |
+ args->GetList(1, &offline_ids_from_arg); |
+ |
+ for (size_t i = 0; i < offline_ids_from_arg->GetSize(); i++) { |
+ std::string value; |
+ offline_ids_from_arg->GetString(i, &value); |
+ int64_t intValue; |
Dan Beam
2016/06/14 15:43:37
int_value
chili
2016/06/14 17:25:44
Done.
|
+ base::StringToInt64(value, &intValue); |
+ offline_ids.push_back(intValue); |
+ } |
+ |
+ offline_page_model_->DeletePagesByOfflineId( |
+ offline_ids, |
+ base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback, |
+ weak_ptr_factory_.GetWeakPtr(), callback_id)); |
} |
-void OfflineInternalsUIMessageHandler::HandleGetOfflineInternalsInfo( |
+void OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback( |
+ std::string callback_id, |
+ offline_pages::DeletePageResult result) { |
+ ResolveJavascriptCallback( |
+ base::StringValue(callback_id), |
+ base::StringValue(GetStringFromDeletePageResult(result))); |
+} |
+ |
+void OfflineInternalsUIMessageHandler::HandleStoredPagesCallback( |
+ std::string callback_id, |
+ const offline_pages::MultipleOfflinePageItemResult& pages) { |
+ base::ListValue results; |
+ |
+ for (const auto& page : pages) { |
+ base::DictionaryValue* js_page_object = new base::DictionaryValue(); |
Dan Beam
2016/06/14 15:43:37
js_page_object -> offline_page
chili
2016/06/14 17:25:44
Done.
|
+ results.Append(js_page_object); |
+ js_page_object->SetString("onlineUrl", page.url.spec()); |
+ js_page_object->SetString("namespace", page.client_id.name_space); |
+ js_page_object->SetDouble("size", page.file_size); |
+ js_page_object->SetString("id", std::to_string(page.offline_id)); |
+ js_page_object->SetString("filePath", page.file_path.value()); |
+ js_page_object->SetDouble("creationTime", page.creation_time.ToJsTime()); |
+ js_page_object->SetDouble("lastAccessTime", |
+ page.last_access_time.ToJsTime()); |
+ js_page_object->SetInteger("accessCount", page.access_count); |
+ } |
+ ResolveJavascriptCallback(base::StringValue(callback_id), results); |
+} |
+ |
+void OfflineInternalsUIMessageHandler::HandleRequestQueueCallback( |
+ std::string callback_id, |
+ offline_pages::RequestQueue::GetRequestsResult result, |
+ const std::vector<offline_pages::SavePageRequest>& requests) { |
+ base::ListValue js_requests; |
Dan Beam
2016/06/14 15:43:37
save_page_request or page_request
chili
2016/06/14 17:25:44
Done.
|
+ if (result == offline_pages::RequestQueue::GetRequestsResult::SUCCESS) { |
+ for (const auto& request : requests) { |
+ base::DictionaryValue* js_request_object = new base::DictionaryValue(); |
Dan Beam
2016/06/14 15:43:37
page_request or save_page_request
chili
2016/06/14 17:25:44
Done.
|
+ js_requests.Append(js_request_object); |
+ js_request_object->SetString("onlineUrl", request.url().spec()); |
+ js_request_object->SetDouble("creationTime", |
+ request.creation_time().ToJsTime()); |
+ js_request_object->SetString( |
+ "status", |
+ GetStringFromSavePageStatus(request.GetStatus(base::Time::Now()))); |
+ js_request_object->SetString("namespace", request.client_id().name_space); |
+ js_request_object->SetDouble("lastAttempt", |
+ request.last_attempt_time().ToJsTime()); |
+ js_request_object->SetString("id", std::to_string(request.request_id())); |
+ } |
+ } |
+ ResolveJavascriptCallback(base::StringValue(callback_id), js_requests); |
+} |
+ |
+void OfflineInternalsUIMessageHandler::HandleGetRequestQueueInfo( |
+ const base::ListValue* args) { |
+ AllowJavascript(); |
+ std::string callback_id; |
+ CHECK(args->GetString(0, &callback_id)); |
+ |
+ if (request_coordinator_) { |
+ request_coordinator_->queue()->GetRequests(base::Bind( |
Dan Beam
2016/06/14 15:43:37
nit: can request_coordinator_ exist but without re
chili
2016/06/14 17:25:44
nope. a queue is required to construct a request c
|
+ &OfflineInternalsUIMessageHandler::HandleRequestQueueCallback, |
+ weak_ptr_factory_.GetWeakPtr(), callback_id)); |
+ } else { |
+ base::ListValue results; |
+ ResolveJavascriptCallback(base::StringValue(callback_id), results); |
+ } |
+} |
+ |
+void OfflineInternalsUIMessageHandler::HandleGetStoredPagesInfo( |
const base::ListValue* args) { |
AllowJavascript(); |
- const base::Value* callback_id; |
- args->Get(0, &callback_id); |
- base::DictionaryValue results; |
- results.Set("AllPages", new base::ListValue()); |
- results.Set("Queue", new base::ListValue()); |
- |
- CallJavascriptFunction("cr.webUIResponse", |
- *callback_id, |
- base::FundamentalValue(true), |
- results); |
+ std::string callback_id; |
+ CHECK(args->GetString(0, &callback_id)); |
+ |
+ if (offline_page_model_) { |
+ offline_page_model_->GetAllPages( |
+ base::Bind(&OfflineInternalsUIMessageHandler::HandleStoredPagesCallback, |
+ weak_ptr_factory_.GetWeakPtr(), callback_id)); |
+ } else { |
+ base::ListValue results; |
+ ResolveJavascriptCallback(base::StringValue(callback_id), results); |
+ } |
} |
void OfflineInternalsUIMessageHandler::RegisterMessages() { |
@@ -95,10 +259,20 @@ void OfflineInternalsUIMessageHandler::RegisterMessages() { |
base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages, |
weak_ptr_factory_.GetWeakPtr())); |
web_ui()->RegisterMessageCallback( |
- "getOfflineInternalsInfo", |
- base::Bind( |
- &OfflineInternalsUIMessageHandler::HandleGetOfflineInternalsInfo, |
- weak_ptr_factory_.GetWeakPtr())); |
+ "getRequestQueueInfo", |
+ base::Bind(&OfflineInternalsUIMessageHandler::HandleGetRequestQueueInfo, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ web_ui()->RegisterMessageCallback( |
+ "getStoredPagesInfo", |
+ base::Bind(&OfflineInternalsUIMessageHandler::HandleGetStoredPagesInfo, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ |
+ // Get the offline page model associated with this web ui. |
+ Profile* profile = Profile::FromWebUI(web_ui()); |
+ offline_page_model_ = |
+ offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile); |
+ request_coordinator_ = |
+ offline_pages::RequestCoordinatorFactory::GetForBrowserContext(profile); |
} |
} // namespace |