OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/webui/offline_internals_ui.h" | 5 #include "chrome/browser/ui/webui/offline_internals_ui.h" |
6 | 6 |
7 #include <string> | 7 #include <stdint.h> |
| 8 #include <stdlib.h> |
| 9 #include <vector> |
8 | 10 |
9 #include "base/bind.h" | 11 #include "base/bind.h" |
10 #include "base/macros.h" | 12 #include "base/macros.h" |
11 #include "base/memory/weak_ptr.h" | 13 #include "base/memory/weak_ptr.h" |
| 14 #include "base/strings/string_number_conversions.h" |
12 #include "base/values.h" | 15 #include "base/values.h" |
| 16 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" |
| 17 #include "chrome/browser/android/offline_pages/request_coordinator_factory.h" |
13 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
14 #include "chrome/common/url_constants.h" | 19 #include "chrome/common/url_constants.h" |
| 20 #include "components/offline_pages/background/request_coordinator.h" |
| 21 #include "components/offline_pages/background/save_page_request.h" |
| 22 #include "components/offline_pages/offline_page_model.h" |
15 #include "content/public/browser/web_ui.h" | 23 #include "content/public/browser/web_ui.h" |
16 #include "content/public/browser/web_ui_controller.h" | 24 #include "content/public/browser/web_ui_controller.h" |
17 #include "content/public/browser/web_ui_data_source.h" | 25 #include "content/public/browser/web_ui_data_source.h" |
18 #include "content/public/browser/web_ui_message_handler.h" | 26 #include "content/public/browser/web_ui_message_handler.h" |
19 #include "grit/browser_resources.h" | 27 #include "grit/browser_resources.h" |
20 | 28 |
21 namespace { | 29 namespace { |
22 | 30 |
23 // Class acting as a controller of the chrome://offline-internals WebUI. | 31 // Class acting as a controller of the chrome://offline-internals WebUI. |
24 class OfflineInternalsUIMessageHandler : public content::WebUIMessageHandler { | 32 class OfflineInternalsUIMessageHandler : public content::WebUIMessageHandler { |
25 public: | 33 public: |
26 OfflineInternalsUIMessageHandler(); | 34 OfflineInternalsUIMessageHandler(); |
27 ~OfflineInternalsUIMessageHandler() override; | 35 ~OfflineInternalsUIMessageHandler() override; |
28 | 36 |
29 // WebUIMessageHandler implementation. | 37 // WebUIMessageHandler implementation. |
30 void RegisterMessages() override; | 38 void RegisterMessages() override; |
31 | 39 |
32 private: | 40 private: |
33 // Deletes all the pages in the store. | 41 // Deletes all the pages in the store. |
34 void HandleDeleteAllPages(const base::ListValue* args); | 42 void HandleDeleteAllPages(const base::ListValue* args); |
35 | 43 |
36 // Delete selected list of page ids from the store. | 44 // Delete selected list of page ids from the store. |
37 void HandleDeleteSelectedPages(const base::ListValue* args); | 45 void HandleDeleteSelectedPages(const base::ListValue* args); |
38 | 46 |
39 // Load all information. | 47 // Load Request Queue info. |
40 void HandleGetOfflineInternalsInfo(const base::ListValue* args); | 48 void HandleGetRequestQueueInfo(const base::ListValue* args); |
| 49 |
| 50 // Load Stored pages info. |
| 51 void HandleGetStoredPagesInfo(const base::ListValue* args); |
| 52 |
| 53 // Callback for async GetAllPages calls. |
| 54 void HandleStoredPagesCallback( |
| 55 std::string callback_id, |
| 56 const offline_pages::MultipleOfflinePageItemResult& pages); |
| 57 |
| 58 // Callback for async GetRequests calls. |
| 59 void HandleRequestQueueCallback( |
| 60 std::string callback_id, |
| 61 offline_pages::RequestQueue::GetRequestsResult result, |
| 62 const std::vector<offline_pages::SavePageRequest>& requests); |
| 63 |
| 64 // Callback for DeletePage/ClearAll calls. |
| 65 void HandleDeletedPagesCallback(std::string callback_id, |
| 66 const offline_pages::DeletePageResult result); |
| 67 |
| 68 // Turns a DeletePageResult enum into logical string. |
| 69 std::string GetStringFromDeletePageResult( |
| 70 offline_pages::DeletePageResult value); |
| 71 |
| 72 // Turns a SavePageRequest::Status into logical string. |
| 73 std::string GetStringFromSavePageStatus( |
| 74 offline_pages::SavePageRequest::Status status); |
| 75 |
| 76 // Offline page model to call methods on. |
| 77 offline_pages::OfflinePageModel* offline_page_model_; |
| 78 |
| 79 // Request coordinator for background offline actions. |
| 80 offline_pages::RequestCoordinator* request_coordinator_; |
41 | 81 |
42 // Factory for creating references in callbacks. | 82 // Factory for creating references in callbacks. |
43 base::WeakPtrFactory<OfflineInternalsUIMessageHandler> weak_ptr_factory_; | 83 base::WeakPtrFactory<OfflineInternalsUIMessageHandler> weak_ptr_factory_; |
44 | 84 |
45 DISALLOW_COPY_AND_ASSIGN(OfflineInternalsUIMessageHandler); | 85 DISALLOW_COPY_AND_ASSIGN(OfflineInternalsUIMessageHandler); |
46 }; | 86 }; |
47 | 87 |
48 OfflineInternalsUIMessageHandler::OfflineInternalsUIMessageHandler() | 88 OfflineInternalsUIMessageHandler::OfflineInternalsUIMessageHandler() |
49 : weak_ptr_factory_(this) {} | 89 : offline_page_model_(nullptr), |
| 90 request_coordinator_(nullptr), |
| 91 weak_ptr_factory_(this) {} |
50 | 92 |
51 OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {} | 93 OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {} |
52 | 94 |
| 95 std::string OfflineInternalsUIMessageHandler::GetStringFromDeletePageResult( |
| 96 offline_pages::DeletePageResult value) { |
| 97 switch (value) { |
| 98 case offline_pages::DeletePageResult::SUCCESS: |
| 99 return "Success"; |
| 100 case offline_pages::DeletePageResult::CANCELLED: |
| 101 return "Cancelled"; |
| 102 case offline_pages::DeletePageResult::STORE_FAILURE: |
| 103 return "Store failure"; |
| 104 case offline_pages::DeletePageResult::DEVICE_FAILURE: |
| 105 return "Device failure"; |
| 106 case offline_pages::DeletePageResult::NOT_FOUND: |
| 107 return "Not found"; |
| 108 case offline_pages::DeletePageResult::RESULT_COUNT: |
| 109 break; |
| 110 } |
| 111 NOTREACHED(); |
| 112 return "Unknown"; |
| 113 } |
| 114 |
| 115 std::string OfflineInternalsUIMessageHandler::GetStringFromSavePageStatus( |
| 116 offline_pages::SavePageRequest::Status status) { |
| 117 switch (status) { |
| 118 case offline_pages::SavePageRequest::Status::NOT_READY: |
| 119 return "Not ready"; |
| 120 case offline_pages::SavePageRequest::Status::PENDING: |
| 121 return "Pending"; |
| 122 case offline_pages::SavePageRequest::Status::STARTED: |
| 123 return "Started"; |
| 124 case offline_pages::SavePageRequest::Status::FAILED: |
| 125 return "Failed"; |
| 126 case offline_pages::SavePageRequest::Status::EXPIRED: |
| 127 return "Expired"; |
| 128 } |
| 129 NOTREACHED(); |
| 130 return "Unknown"; |
| 131 } |
| 132 |
53 void OfflineInternalsUIMessageHandler::HandleDeleteAllPages( | 133 void OfflineInternalsUIMessageHandler::HandleDeleteAllPages( |
54 const base::ListValue* args) { | 134 const base::ListValue* args) { |
55 const base::Value* callback_id; | 135 std::string callback_id; |
56 args->Get(0, &callback_id); | 136 CHECK(args->GetString(0, &callback_id)); |
57 CallJavascriptFunction("cr.webUIResponse", | 137 |
58 *callback_id, | 138 // Pass back success because ClearAll doesn't return a status. |
59 base::FundamentalValue(true), | 139 offline_page_model_->ClearAll( |
60 base::StringValue("success")); | 140 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback, |
| 141 weak_ptr_factory_.GetWeakPtr(), callback_id, |
| 142 offline_pages::DeletePageResult::SUCCESS)); |
61 } | 143 } |
62 | 144 |
63 void OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages( | 145 void OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages( |
64 const base::ListValue* args) { | 146 const base::ListValue* args) { |
65 const base::Value* callback_id; | 147 std::string callback_id; |
66 args->Get(0, &callback_id); | 148 CHECK(args->GetString(0, &callback_id)); |
67 CallJavascriptFunction("cr.webUIResponse", | 149 |
68 *callback_id, | 150 std::vector<int64_t> offline_ids; |
69 base::FundamentalValue(true), | 151 const base::ListValue* offline_ids_from_arg; |
70 base::StringValue("success")); | 152 args->GetList(1, &offline_ids_from_arg); |
| 153 |
| 154 for (size_t i = 0; i < offline_ids_from_arg->GetSize(); i++) { |
| 155 std::string value; |
| 156 offline_ids_from_arg->GetString(i, &value); |
| 157 int64_t int_value; |
| 158 base::StringToInt64(value, &int_value); |
| 159 offline_ids.push_back(int_value); |
| 160 } |
| 161 |
| 162 offline_page_model_->DeletePagesByOfflineId( |
| 163 offline_ids, |
| 164 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback, |
| 165 weak_ptr_factory_.GetWeakPtr(), callback_id)); |
71 } | 166 } |
72 | 167 |
73 void OfflineInternalsUIMessageHandler::HandleGetOfflineInternalsInfo( | 168 void OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback( |
| 169 std::string callback_id, |
| 170 offline_pages::DeletePageResult result) { |
| 171 ResolveJavascriptCallback( |
| 172 base::StringValue(callback_id), |
| 173 base::StringValue(GetStringFromDeletePageResult(result))); |
| 174 } |
| 175 |
| 176 void OfflineInternalsUIMessageHandler::HandleStoredPagesCallback( |
| 177 std::string callback_id, |
| 178 const offline_pages::MultipleOfflinePageItemResult& pages) { |
| 179 base::ListValue results; |
| 180 |
| 181 for (const auto& page : pages) { |
| 182 base::DictionaryValue* offline_page = new base::DictionaryValue(); |
| 183 results.Append(offline_page); |
| 184 offline_page->SetString("onlineUrl", page.url.spec()); |
| 185 offline_page->SetString("namespace", page.client_id.name_space); |
| 186 offline_page->SetDouble("size", page.file_size); |
| 187 offline_page->SetString("id", std::to_string(page.offline_id)); |
| 188 offline_page->SetString("filePath", page.file_path.value()); |
| 189 offline_page->SetDouble("creationTime", page.creation_time.ToJsTime()); |
| 190 offline_page->SetDouble("lastAccessTime", |
| 191 page.last_access_time.ToJsTime()); |
| 192 offline_page->SetInteger("accessCount", page.access_count); |
| 193 } |
| 194 ResolveJavascriptCallback(base::StringValue(callback_id), results); |
| 195 } |
| 196 |
| 197 void OfflineInternalsUIMessageHandler::HandleRequestQueueCallback( |
| 198 std::string callback_id, |
| 199 offline_pages::RequestQueue::GetRequestsResult result, |
| 200 const std::vector<offline_pages::SavePageRequest>& requests) { |
| 201 base::ListValue save_page_requests; |
| 202 if (result == offline_pages::RequestQueue::GetRequestsResult::SUCCESS) { |
| 203 for (const auto& request : requests) { |
| 204 base::DictionaryValue* save_page_request = new base::DictionaryValue(); |
| 205 save_page_requests.Append(save_page_request); |
| 206 save_page_request->SetString("onlineUrl", request.url().spec()); |
| 207 save_page_request->SetDouble("creationTime", |
| 208 request.creation_time().ToJsTime()); |
| 209 save_page_request->SetString( |
| 210 "status", |
| 211 GetStringFromSavePageStatus(request.GetStatus(base::Time::Now()))); |
| 212 save_page_request->SetString("namespace", request.client_id().name_space); |
| 213 save_page_request->SetDouble("lastAttempt", |
| 214 request.last_attempt_time().ToJsTime()); |
| 215 save_page_request->SetString("id", std::to_string(request.request_id())); |
| 216 } |
| 217 } |
| 218 ResolveJavascriptCallback(base::StringValue(callback_id), save_page_requests); |
| 219 } |
| 220 |
| 221 void OfflineInternalsUIMessageHandler::HandleGetRequestQueueInfo( |
74 const base::ListValue* args) { | 222 const base::ListValue* args) { |
75 AllowJavascript(); | 223 AllowJavascript(); |
76 const base::Value* callback_id; | 224 std::string callback_id; |
77 args->Get(0, &callback_id); | 225 CHECK(args->GetString(0, &callback_id)); |
78 base::DictionaryValue results; | |
79 results.Set("AllPages", new base::ListValue()); | |
80 results.Set("Queue", new base::ListValue()); | |
81 | 226 |
82 CallJavascriptFunction("cr.webUIResponse", | 227 if (request_coordinator_) { |
83 *callback_id, | 228 request_coordinator_->queue()->GetRequests(base::Bind( |
84 base::FundamentalValue(true), | 229 &OfflineInternalsUIMessageHandler::HandleRequestQueueCallback, |
85 results); | 230 weak_ptr_factory_.GetWeakPtr(), callback_id)); |
| 231 } else { |
| 232 base::ListValue results; |
| 233 ResolveJavascriptCallback(base::StringValue(callback_id), results); |
| 234 } |
| 235 } |
| 236 |
| 237 void OfflineInternalsUIMessageHandler::HandleGetStoredPagesInfo( |
| 238 const base::ListValue* args) { |
| 239 AllowJavascript(); |
| 240 std::string callback_id; |
| 241 CHECK(args->GetString(0, &callback_id)); |
| 242 |
| 243 if (offline_page_model_) { |
| 244 offline_page_model_->GetAllPages( |
| 245 base::Bind(&OfflineInternalsUIMessageHandler::HandleStoredPagesCallback, |
| 246 weak_ptr_factory_.GetWeakPtr(), callback_id)); |
| 247 } else { |
| 248 base::ListValue results; |
| 249 ResolveJavascriptCallback(base::StringValue(callback_id), results); |
| 250 } |
86 } | 251 } |
87 | 252 |
88 void OfflineInternalsUIMessageHandler::RegisterMessages() { | 253 void OfflineInternalsUIMessageHandler::RegisterMessages() { |
89 web_ui()->RegisterMessageCallback( | 254 web_ui()->RegisterMessageCallback( |
90 "deleteAllPages", | 255 "deleteAllPages", |
91 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteAllPages, | 256 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteAllPages, |
92 weak_ptr_factory_.GetWeakPtr())); | 257 weak_ptr_factory_.GetWeakPtr())); |
93 web_ui()->RegisterMessageCallback( | 258 web_ui()->RegisterMessageCallback( |
94 "deleteSelectedPages", | 259 "deleteSelectedPages", |
95 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages, | 260 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages, |
96 weak_ptr_factory_.GetWeakPtr())); | 261 weak_ptr_factory_.GetWeakPtr())); |
97 web_ui()->RegisterMessageCallback( | 262 web_ui()->RegisterMessageCallback( |
98 "getOfflineInternalsInfo", | 263 "getRequestQueueInfo", |
99 base::Bind( | 264 base::Bind(&OfflineInternalsUIMessageHandler::HandleGetRequestQueueInfo, |
100 &OfflineInternalsUIMessageHandler::HandleGetOfflineInternalsInfo, | 265 weak_ptr_factory_.GetWeakPtr())); |
101 weak_ptr_factory_.GetWeakPtr())); | 266 web_ui()->RegisterMessageCallback( |
| 267 "getStoredPagesInfo", |
| 268 base::Bind(&OfflineInternalsUIMessageHandler::HandleGetStoredPagesInfo, |
| 269 weak_ptr_factory_.GetWeakPtr())); |
| 270 |
| 271 // Get the offline page model associated with this web ui. |
| 272 Profile* profile = Profile::FromWebUI(web_ui()); |
| 273 offline_page_model_ = |
| 274 offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile); |
| 275 request_coordinator_ = |
| 276 offline_pages::RequestCoordinatorFactory::GetForBrowserContext(profile); |
102 } | 277 } |
103 | 278 |
104 } // namespace | 279 } // namespace |
105 | 280 |
106 OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui) | 281 OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui) |
107 : content::WebUIController(web_ui) { | 282 : content::WebUIController(web_ui) { |
108 // chrome://offline-internals source. | 283 // chrome://offline-internals source. |
109 content::WebUIDataSource* html_source = | 284 content::WebUIDataSource* html_source = |
110 content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost); | 285 content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost); |
111 | 286 |
112 // Required resources. | 287 // Required resources. |
113 html_source->SetJsonPath("strings.js"); | 288 html_source->SetJsonPath("strings.js"); |
114 html_source->AddResourcePath("offline_internals.css", | 289 html_source->AddResourcePath("offline_internals.css", |
115 IDR_OFFLINE_INTERNALS_CSS); | 290 IDR_OFFLINE_INTERNALS_CSS); |
116 html_source->AddResourcePath("offline_internals.js", | 291 html_source->AddResourcePath("offline_internals.js", |
117 IDR_OFFLINE_INTERNALS_JS); | 292 IDR_OFFLINE_INTERNALS_JS); |
118 html_source->SetDefaultResource(IDR_OFFLINE_INTERNALS_HTML); | 293 html_source->SetDefaultResource(IDR_OFFLINE_INTERNALS_HTML); |
119 | 294 |
120 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source); | 295 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source); |
121 | 296 |
122 web_ui->AddMessageHandler(new OfflineInternalsUIMessageHandler()); | 297 web_ui->AddMessageHandler(new OfflineInternalsUIMessageHandler()); |
123 } | 298 } |
124 | 299 |
125 OfflineInternalsUI::~OfflineInternalsUI() {} | 300 OfflineInternalsUI::~OfflineInternalsUI() {} |
OLD | NEW |