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_; | |
Dan Beam
2016/06/14 15:43:37
this should be initialized to nullptr
chili
2016/06/14 17:25:43
Done.
| |
78 | |
79 // Request coordinator for background offline actions. | |
80 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.
| |
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 : weak_ptr_factory_(this) {} |
50 | 90 |
51 OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {} | 91 OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {} |
52 | 92 |
93 std::string OfflineInternalsUIMessageHandler::GetStringFromDeletePageResult( | |
94 offline_pages::DeletePageResult value) { | |
95 switch (value) { | |
96 case offline_pages::DeletePageResult::SUCCESS: | |
97 return "Success"; | |
98 case offline_pages::DeletePageResult::CANCELLED: | |
99 return "Cancelled"; | |
100 case offline_pages::DeletePageResult::STORE_FAILURE: | |
101 return "Store failure"; | |
102 case offline_pages::DeletePageResult::DEVICE_FAILURE: | |
103 return "Device failure"; | |
104 case offline_pages::DeletePageResult::NOT_FOUND: | |
105 return "Not found"; | |
106 case offline_pages::DeletePageResult::RESULT_COUNT: | |
107 NOTREACHED(); | |
108 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.
| |
109 } | |
110 NOTREACHED(); | |
111 return "Unknown"; | |
112 } | |
113 | |
114 std::string OfflineInternalsUIMessageHandler::GetStringFromSavePageStatus( | |
115 offline_pages::SavePageRequest::Status status) { | |
116 switch (status) { | |
117 case offline_pages::SavePageRequest::Status::NOT_READY: | |
118 return "Not ready"; | |
119 case offline_pages::SavePageRequest::Status::PENDING: | |
120 return "Pending"; | |
121 case offline_pages::SavePageRequest::Status::STARTED: | |
122 return "Started"; | |
123 case offline_pages::SavePageRequest::Status::FAILED: | |
124 return "Failed"; | |
125 case offline_pages::SavePageRequest::Status::EXPIRED: | |
126 return "Expired"; | |
127 } | |
128 NOTREACHED(); | |
129 return "Unknown"; | |
130 } | |
131 | |
53 void OfflineInternalsUIMessageHandler::HandleDeleteAllPages( | 132 void OfflineInternalsUIMessageHandler::HandleDeleteAllPages( |
54 const base::ListValue* args) { | 133 const base::ListValue* args) { |
55 const base::Value* callback_id; | 134 std::string callback_id; |
56 args->Get(0, &callback_id); | 135 CHECK(args->GetString(0, &callback_id)); |
57 CallJavascriptFunction("cr.webUIResponse", | 136 |
58 *callback_id, | 137 // Pass back success because ClearAll doesn't return a status. |
59 base::FundamentalValue(true), | 138 offline_page_model_->ClearAll( |
60 base::StringValue("success")); | 139 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback, |
140 weak_ptr_factory_.GetWeakPtr(), callback_id, | |
141 offline_pages::DeletePageResult::SUCCESS)); | |
61 } | 142 } |
62 | 143 |
63 void OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages( | 144 void OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages( |
64 const base::ListValue* args) { | 145 const base::ListValue* args) { |
65 const base::Value* callback_id; | 146 std::string callback_id; |
66 args->Get(0, &callback_id); | 147 CHECK(args->GetString(0, &callback_id)); |
67 CallJavascriptFunction("cr.webUIResponse", | 148 |
68 *callback_id, | 149 std::vector<int64_t> offline_ids; |
69 base::FundamentalValue(true), | 150 const base::ListValue* offline_ids_from_arg; |
70 base::StringValue("success")); | 151 args->GetList(1, &offline_ids_from_arg); |
152 | |
153 for (size_t i = 0; i < offline_ids_from_arg->GetSize(); i++) { | |
154 std::string value; | |
155 offline_ids_from_arg->GetString(i, &value); | |
156 int64_t intValue; | |
Dan Beam
2016/06/14 15:43:37
int_value
chili
2016/06/14 17:25:44
Done.
| |
157 base::StringToInt64(value, &intValue); | |
158 offline_ids.push_back(intValue); | |
159 } | |
160 | |
161 offline_page_model_->DeletePagesByOfflineId( | |
162 offline_ids, | |
163 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback, | |
164 weak_ptr_factory_.GetWeakPtr(), callback_id)); | |
71 } | 165 } |
72 | 166 |
73 void OfflineInternalsUIMessageHandler::HandleGetOfflineInternalsInfo( | 167 void OfflineInternalsUIMessageHandler::HandleDeletedPagesCallback( |
168 std::string callback_id, | |
169 offline_pages::DeletePageResult result) { | |
170 ResolveJavascriptCallback( | |
171 base::StringValue(callback_id), | |
172 base::StringValue(GetStringFromDeletePageResult(result))); | |
173 } | |
174 | |
175 void OfflineInternalsUIMessageHandler::HandleStoredPagesCallback( | |
176 std::string callback_id, | |
177 const offline_pages::MultipleOfflinePageItemResult& pages) { | |
178 base::ListValue results; | |
179 | |
180 for (const auto& page : pages) { | |
181 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.
| |
182 results.Append(js_page_object); | |
183 js_page_object->SetString("onlineUrl", page.url.spec()); | |
184 js_page_object->SetString("namespace", page.client_id.name_space); | |
185 js_page_object->SetDouble("size", page.file_size); | |
186 js_page_object->SetString("id", std::to_string(page.offline_id)); | |
187 js_page_object->SetString("filePath", page.file_path.value()); | |
188 js_page_object->SetDouble("creationTime", page.creation_time.ToJsTime()); | |
189 js_page_object->SetDouble("lastAccessTime", | |
190 page.last_access_time.ToJsTime()); | |
191 js_page_object->SetInteger("accessCount", page.access_count); | |
192 } | |
193 ResolveJavascriptCallback(base::StringValue(callback_id), results); | |
194 } | |
195 | |
196 void OfflineInternalsUIMessageHandler::HandleRequestQueueCallback( | |
197 std::string callback_id, | |
198 offline_pages::RequestQueue::GetRequestsResult result, | |
199 const std::vector<offline_pages::SavePageRequest>& requests) { | |
200 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.
| |
201 if (result == offline_pages::RequestQueue::GetRequestsResult::SUCCESS) { | |
202 for (const auto& request : requests) { | |
203 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.
| |
204 js_requests.Append(js_request_object); | |
205 js_request_object->SetString("onlineUrl", request.url().spec()); | |
206 js_request_object->SetDouble("creationTime", | |
207 request.creation_time().ToJsTime()); | |
208 js_request_object->SetString( | |
209 "status", | |
210 GetStringFromSavePageStatus(request.GetStatus(base::Time::Now()))); | |
211 js_request_object->SetString("namespace", request.client_id().name_space); | |
212 js_request_object->SetDouble("lastAttempt", | |
213 request.last_attempt_time().ToJsTime()); | |
214 js_request_object->SetString("id", std::to_string(request.request_id())); | |
215 } | |
216 } | |
217 ResolveJavascriptCallback(base::StringValue(callback_id), js_requests); | |
218 } | |
219 | |
220 void OfflineInternalsUIMessageHandler::HandleGetRequestQueueInfo( | |
74 const base::ListValue* args) { | 221 const base::ListValue* args) { |
75 AllowJavascript(); | 222 AllowJavascript(); |
76 const base::Value* callback_id; | 223 std::string callback_id; |
77 args->Get(0, &callback_id); | 224 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 | 225 |
82 CallJavascriptFunction("cr.webUIResponse", | 226 if (request_coordinator_) { |
83 *callback_id, | 227 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
| |
84 base::FundamentalValue(true), | 228 &OfflineInternalsUIMessageHandler::HandleRequestQueueCallback, |
85 results); | 229 weak_ptr_factory_.GetWeakPtr(), callback_id)); |
230 } else { | |
231 base::ListValue results; | |
232 ResolveJavascriptCallback(base::StringValue(callback_id), results); | |
233 } | |
234 } | |
235 | |
236 void OfflineInternalsUIMessageHandler::HandleGetStoredPagesInfo( | |
237 const base::ListValue* args) { | |
238 AllowJavascript(); | |
239 std::string callback_id; | |
240 CHECK(args->GetString(0, &callback_id)); | |
241 | |
242 if (offline_page_model_) { | |
243 offline_page_model_->GetAllPages( | |
244 base::Bind(&OfflineInternalsUIMessageHandler::HandleStoredPagesCallback, | |
245 weak_ptr_factory_.GetWeakPtr(), callback_id)); | |
246 } else { | |
247 base::ListValue results; | |
248 ResolveJavascriptCallback(base::StringValue(callback_id), results); | |
249 } | |
86 } | 250 } |
87 | 251 |
88 void OfflineInternalsUIMessageHandler::RegisterMessages() { | 252 void OfflineInternalsUIMessageHandler::RegisterMessages() { |
89 web_ui()->RegisterMessageCallback( | 253 web_ui()->RegisterMessageCallback( |
90 "deleteAllPages", | 254 "deleteAllPages", |
91 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteAllPages, | 255 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteAllPages, |
92 weak_ptr_factory_.GetWeakPtr())); | 256 weak_ptr_factory_.GetWeakPtr())); |
93 web_ui()->RegisterMessageCallback( | 257 web_ui()->RegisterMessageCallback( |
94 "deleteSelectedPages", | 258 "deleteSelectedPages", |
95 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages, | 259 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages, |
96 weak_ptr_factory_.GetWeakPtr())); | 260 weak_ptr_factory_.GetWeakPtr())); |
97 web_ui()->RegisterMessageCallback( | 261 web_ui()->RegisterMessageCallback( |
98 "getOfflineInternalsInfo", | 262 "getRequestQueueInfo", |
99 base::Bind( | 263 base::Bind(&OfflineInternalsUIMessageHandler::HandleGetRequestQueueInfo, |
100 &OfflineInternalsUIMessageHandler::HandleGetOfflineInternalsInfo, | 264 weak_ptr_factory_.GetWeakPtr())); |
101 weak_ptr_factory_.GetWeakPtr())); | 265 web_ui()->RegisterMessageCallback( |
266 "getStoredPagesInfo", | |
267 base::Bind(&OfflineInternalsUIMessageHandler::HandleGetStoredPagesInfo, | |
268 weak_ptr_factory_.GetWeakPtr())); | |
269 | |
270 // Get the offline page model associated with this web ui. | |
271 Profile* profile = Profile::FromWebUI(web_ui()); | |
272 offline_page_model_ = | |
273 offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile); | |
274 request_coordinator_ = | |
275 offline_pages::RequestCoordinatorFactory::GetForBrowserContext(profile); | |
102 } | 276 } |
103 | 277 |
104 } // namespace | 278 } // namespace |
105 | 279 |
106 OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui) | 280 OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui) |
107 : content::WebUIController(web_ui) { | 281 : content::WebUIController(web_ui) { |
108 // chrome://offline-internals source. | 282 // chrome://offline-internals source. |
109 content::WebUIDataSource* html_source = | 283 content::WebUIDataSource* html_source = |
110 content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost); | 284 content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost); |
111 | 285 |
112 // Required resources. | 286 // Required resources. |
113 html_source->SetJsonPath("strings.js"); | 287 html_source->SetJsonPath("strings.js"); |
114 html_source->AddResourcePath("offline_internals.css", | 288 html_source->AddResourcePath("offline_internals.css", |
115 IDR_OFFLINE_INTERNALS_CSS); | 289 IDR_OFFLINE_INTERNALS_CSS); |
116 html_source->AddResourcePath("offline_internals.js", | 290 html_source->AddResourcePath("offline_internals.js", |
117 IDR_OFFLINE_INTERNALS_JS); | 291 IDR_OFFLINE_INTERNALS_JS); |
118 html_source->SetDefaultResource(IDR_OFFLINE_INTERNALS_HTML); | 292 html_source->SetDefaultResource(IDR_OFFLINE_INTERNALS_HTML); |
119 | 293 |
120 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source); | 294 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source); |
121 | 295 |
122 web_ui->AddMessageHandler(new OfflineInternalsUIMessageHandler()); | 296 web_ui->AddMessageHandler(new OfflineInternalsUIMessageHandler()); |
123 } | 297 } |
124 | 298 |
125 OfflineInternalsUI::~OfflineInternalsUI() {} | 299 OfflineInternalsUI::~OfflineInternalsUI() {} |
OLD | NEW |