Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Side by Side Diff: chrome/browser/ui/webui/offline_internals_ui.cc

Issue 2038963002: [Offline Pages] Link the internals page with the offline model and request (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: try to fix patch dependency #2 Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
12 #include "base/values.h" 14 #include "base/values.h"
15 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h"
16 #include "chrome/browser/android/offline_pages/request_coordinator_factory.h"
13 #include "chrome/browser/profiles/profile.h" 17 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/common/url_constants.h" 18 #include "chrome/common/url_constants.h"
19 #include "components/offline_pages/background/request_coordinator.h"
20 #include "components/offline_pages/background/save_page_request.h"
21 #include "components/offline_pages/offline_page_model.h"
15 #include "content/public/browser/web_ui.h" 22 #include "content/public/browser/web_ui.h"
16 #include "content/public/browser/web_ui_controller.h" 23 #include "content/public/browser/web_ui_controller.h"
17 #include "content/public/browser/web_ui_data_source.h" 24 #include "content/public/browser/web_ui_data_source.h"
18 #include "content/public/browser/web_ui_message_handler.h" 25 #include "content/public/browser/web_ui_message_handler.h"
19 #include "grit/browser_resources.h" 26 #include "grit/browser_resources.h"
20 27
21 namespace { 28 namespace {
22 29
23 // Class acting as a controller of the chrome://offline-internals WebUI. 30 // Class acting as a controller of the chrome://offline-internals WebUI.
24 class OfflineInternalsUIMessageHandler : public content::WebUIMessageHandler { 31 class OfflineInternalsUIMessageHandler : public content::WebUIMessageHandler {
25 public: 32 public:
26 OfflineInternalsUIMessageHandler(); 33 OfflineInternalsUIMessageHandler();
27 ~OfflineInternalsUIMessageHandler() override; 34 ~OfflineInternalsUIMessageHandler() override;
28 35
29 // WebUIMessageHandler implementation. 36 // WebUIMessageHandler implementation.
30 void RegisterMessages() override; 37 void RegisterMessages() override;
31 38
32 private: 39 private:
33 // Deletes all the pages in the store. 40 // Deletes all the pages in the store.
34 void DeleteAllPages(const base::ListValue* args); 41 void DeleteAllPages(const base::ListValue* args);
35 42
36 // Delete selected list of page ids from the store. 43 // Delete selected list of page ids from the store.
37 void DeleteSelectedPages(const base::ListValue* args); 44 void DeleteSelectedPages(const base::ListValue* args);
38 45
39 // Load all information. 46 // Load Request Queue info.
40 void GetOfflineInternalsInfo(const base::ListValue* args); 47 void GetRequestQueue(const base::ListValue* args);
48
49 // Load Stored pages info.
50 void GetStoredPages(const base::ListValue* args);
51
52 // Callback for async GetAllPages calls.
53 void HandleStoredPages(
54 std::string callback_id,
55 const offline_pages::MultipleOfflinePageItemResult& pages);
56
57 // Callback for async GetRequests calls.
58 void HandleRequestQueue(
59 std::string callback_id,
60 offline_pages::RequestQueue::GetRequestsResult result,
61 const std::vector<offline_pages::SavePageRequest>& requests);
62
63 // Callback for DeletePage/ClearAll calls.
64 void HandleDeletedPages(std::string callback_id,
65 const offline_pages::DeletePageResult result);
66
67 std::string GetStringFromDeletePageResult(
dewittj 2016/06/03 23:12:06 Please define out of line. This might be better d
chili 2016/06/09 22:29:16 I was hesitating between putting this here vs offl
dewittj 2016/06/09 23:41:25 Not everyone is going to necessarily use this page
68 offline_pages::DeletePageResult value) {
69 const std::string kDeletePageResultToString[] = {
70 "Success", "Canceled", "Store failure", "Device failure", "Not found"};
71 int int_value = static_cast<int>(value);
72 if (int_value >= 5)
73 return "Unknown";
74 else
75 return kDeletePageResultToString[int_value];
76 }
77
78 std::string GetStringFromSavePageStatus(
79 offline_pages::SavePageRequest::Status status) {
80 const std::string kRequestStatusToString[] = {
81 "Not ready", "Pending", "Started", "Failed", "Expired"};
82 int int_value = static_cast<int>(status);
83 if (int_value >= 5)
84 return "Unknown";
85 else
86 return kRequestStatusToString[int_value];
87 }
88
89 // Offline page model to call methods on.
90 offline_pages::OfflinePageModel* offline_page_model_;
91 // Request coordinator for background offline actions.
92 offline_pages::RequestCoordinator* request_coordinator_;
41 93
42 // Factory for creating references in callbacks. 94 // Factory for creating references in callbacks.
43 base::WeakPtrFactory<OfflineInternalsUIMessageHandler> weak_ptr_factory_; 95 base::WeakPtrFactory<OfflineInternalsUIMessageHandler> weak_ptr_factory_;
44 96
45 DISALLOW_COPY_AND_ASSIGN(OfflineInternalsUIMessageHandler); 97 DISALLOW_COPY_AND_ASSIGN(OfflineInternalsUIMessageHandler);
46 }; 98 };
47 99
48 OfflineInternalsUIMessageHandler::OfflineInternalsUIMessageHandler() 100 OfflineInternalsUIMessageHandler::OfflineInternalsUIMessageHandler()
49 : weak_ptr_factory_(this) {} 101 : weak_ptr_factory_(this) {}
50 102
51 OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {} 103 OfflineInternalsUIMessageHandler::~OfflineInternalsUIMessageHandler() {}
52 104
53 void OfflineInternalsUIMessageHandler::DeleteAllPages( 105 void OfflineInternalsUIMessageHandler::DeleteAllPages(
54 const base::ListValue* args) { 106 const base::ListValue* args) {
55 std::string callback_id; 107 std::string callback_id;
56 args->GetString(0, &callback_id); 108 args->GetString(0, &callback_id);
57 web_ui()->CallJavascriptFunction("cr.webUIResponse", 109
58 base::StringValue(callback_id), 110 offline_page_model_->ClearAll(
59 base::FundamentalValue(true), 111 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPages,
60 base::StringValue("success")); 112 weak_ptr_factory_.GetWeakPtr(), callback_id,
113 offline_pages::DeletePageResult::SUCCESS));
dewittj 2016/06/03 23:12:06 Please add a comment that this is here because Cle
chili 2016/06/09 22:29:16 Done.
61 } 114 }
62 115
63 void OfflineInternalsUIMessageHandler::DeleteSelectedPages( 116 void OfflineInternalsUIMessageHandler::DeleteSelectedPages(
64 const base::ListValue* args) { 117 const base::ListValue* args) {
65 std::string callback_id; 118 std::string callback_id;
66 args->GetString(0, &callback_id); 119 args->GetString(0, &callback_id);
67 web_ui()->CallJavascriptFunction("cr.webUIResponse", 120
68 base::StringValue(callback_id), 121 std::vector<int64_t> offline_ids;
69 base::FundamentalValue(true), 122 const base::ListValue* offline_ids_from_arg;
70 base::StringValue("success")); 123 args->GetList(1, &offline_ids_from_arg);
124
125 for (size_t i = 0; i < offline_ids_from_arg->GetSize(); i++) {
126 std::string value;
127 offline_ids_from_arg->GetString(i, &value);
128 offline_ids.push_back(atoll(value.c_str()));
dewittj 2016/06/03 23:12:06 not sure if there is some function in Chromium to
chili 2016/06/09 22:29:16 you can set base in strtoll, but I didn't think th
129 }
130
131 offline_page_model_->DeletePagesByOfflineId(
132 offline_ids,
133 base::Bind(&OfflineInternalsUIMessageHandler::HandleDeletedPages,
134 weak_ptr_factory_.GetWeakPtr(), callback_id));
71 } 135 }
72 136
73 void OfflineInternalsUIMessageHandler::GetOfflineInternalsInfo( 137 void OfflineInternalsUIMessageHandler::HandleDeletedPages(
138 std::string callback_id,
139 offline_pages::DeletePageResult result) {
140 web_ui()->CallJavascriptFunction(
141 "cr.webUIResponse", base::StringValue(callback_id),
142 base::FundamentalValue(true),
143 base::StringValue(GetStringFromDeletePageResult(result)));
144 }
145
146 void OfflineInternalsUIMessageHandler::HandleStoredPages(
147 std::string callback_id,
148 const offline_pages::MultipleOfflinePageItemResult& pages) {
149 base::ListValue results;
150
151 for (const auto& page : pages) {
152 base::DictionaryValue* js_page_object = new base::DictionaryValue();
153 results.Append(js_page_object);
154 js_page_object->SetString("onlineUrl", page.url.spec());
dewittj 2016/06/03 23:12:06 I wish we didn't have so many hard-coded strings a
chili 2016/06/09 22:29:16 I do too, but I chose to hard-code them here rathe
155 js_page_object->SetString("namespace", page.client_id.name_space);
156 js_page_object->SetDouble("size", page.file_size);
157 js_page_object->SetString("id", std::to_string(page.offline_id));
158 js_page_object->SetString("filePath", page.file_path.value());
159 js_page_object->SetDouble("creationTime", page.creation_time.ToJsTime());
160 js_page_object->SetDouble("lastAccessedTime",
161 page.last_access_time.ToJsTime());
162 js_page_object->SetInteger("accessCount", page.access_count);
163 }
164 web_ui()->CallJavascriptFunction("cr.webUIResponse",
165 base::StringValue(callback_id),
166 base::FundamentalValue(true), results);
167 }
168
169 void OfflineInternalsUIMessageHandler::HandleRequestQueue(
170 std::string callback_id,
171 offline_pages::RequestQueue::GetRequestsResult result,
172 const std::vector<offline_pages::SavePageRequest>& requests) {
173 base::ListValue js_requests;
174 if (result == offline_pages::RequestQueue::GetRequestsResult::kSuccess) {
175 for (const auto& request : requests) {
176 base::DictionaryValue* js_request_object = new base::DictionaryValue();
177 js_requests.Append(js_request_object);
178 js_request_object->SetString("onlineUrl", request.url().spec());
179 js_request_object->SetDouble("creationTime",
180 request.creation_time().ToJsTime());
181 js_request_object->SetString(
182 "status",
183 GetStringFromSavePageStatus(request.GetStatus(base::Time::Now())));
184 js_request_object->SetString("namespace", request.client_id().name_space);
185 js_request_object->SetDouble("lastAttempt",
186 request.last_attempt_time().ToJsTime());
187 js_request_object->SetString("id", std::to_string(request.request_id()));
188 }
189 }
190 web_ui()->CallJavascriptFunction("cr.webUIResponse",
191 base::StringValue(callback_id),
192 base::FundamentalValue(true), js_requests);
193 }
194
195 void OfflineInternalsUIMessageHandler::GetRequestQueue(
74 const base::ListValue* args) { 196 const base::ListValue* args) {
75 std::string callback_id; 197 std::string callback_id;
76 args->GetString(0, &callback_id); 198 args->GetString(0, &callback_id);
77 base::DictionaryValue results; 199 base::ListValue results;
78 results.Set("AllPages", new base::ListValue());
79 results.Set("Queue", new base::ListValue());
80 200
81 web_ui()->CallJavascriptFunction("cr.webUIResponse", 201 if (request_coordinator_ != nullptr)
82 base::StringValue(callback_id), 202 request_coordinator_->queue()->GetRequests(
83 base::FundamentalValue(true), 203 base::Bind(&OfflineInternalsUIMessageHandler::HandleRequestQueue,
84 results); 204 weak_ptr_factory_.GetWeakPtr(), callback_id));
205 }
206
207 void OfflineInternalsUIMessageHandler::GetStoredPages(
208 const base::ListValue* args) {
209 std::string callback_id;
210 args->GetString(0, &callback_id);
211 base::ListValue results;
212
213 if (offline_page_model_ != nullptr)
214 offline_page_model_->GetAllPages(
215 base::Bind(&OfflineInternalsUIMessageHandler::HandleStoredPages,
216 weak_ptr_factory_.GetWeakPtr(), callback_id));
85 } 217 }
86 218
87 void OfflineInternalsUIMessageHandler::RegisterMessages() { 219 void OfflineInternalsUIMessageHandler::RegisterMessages() {
88 web_ui()->RegisterMessageCallback( 220 web_ui()->RegisterMessageCallback(
89 "deleteAllPages", 221 "deleteAllPages",
90 base::Bind(&OfflineInternalsUIMessageHandler::DeleteAllPages, 222 base::Bind(&OfflineInternalsUIMessageHandler::DeleteAllPages,
91 weak_ptr_factory_.GetWeakPtr())); 223 weak_ptr_factory_.GetWeakPtr()));
92 web_ui()->RegisterMessageCallback( 224 web_ui()->RegisterMessageCallback(
93 "deleteSelectedPages", 225 "deleteSelectedPages",
94 base::Bind(&OfflineInternalsUIMessageHandler::DeleteSelectedPages, 226 base::Bind(&OfflineInternalsUIMessageHandler::DeleteSelectedPages,
95 weak_ptr_factory_.GetWeakPtr())); 227 weak_ptr_factory_.GetWeakPtr()));
96 web_ui()->RegisterMessageCallback( 228 web_ui()->RegisterMessageCallback(
97 "getOfflineInternalsInfo", 229 "getRequestQueueInfo",
98 base::Bind(&OfflineInternalsUIMessageHandler::GetOfflineInternalsInfo, 230 base::Bind(&OfflineInternalsUIMessageHandler::GetRequestQueue,
99 weak_ptr_factory_.GetWeakPtr())); 231 weak_ptr_factory_.GetWeakPtr()));
232 web_ui()->RegisterMessageCallback(
233 "getStoredPagesInfo",
234 base::Bind(&OfflineInternalsUIMessageHandler::GetStoredPages,
235 weak_ptr_factory_.GetWeakPtr()));
236
237 // Get the offline page model associated with this web ui.
238 Profile* profile = Profile::FromWebUI(web_ui());
239 offline_page_model_ =
240 offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile);
241 request_coordinator_ =
242 offline_pages::RequestCoordinatorFactory::GetForBrowserContext(profile);
100 } 243 }
101 244
102 } // namespace 245 } // namespace
103 246
104 OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui) 247 OfflineInternalsUI::OfflineInternalsUI(content::WebUI* web_ui)
105 : content::WebUIController(web_ui) { 248 : content::WebUIController(web_ui) {
106 // chrome://offline-internals source. 249 // chrome://offline-internals source.
107 content::WebUIDataSource* html_source = 250 content::WebUIDataSource* html_source =
108 content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost); 251 content::WebUIDataSource::Create(chrome::kChromeUIOfflineInternalsHost);
109 252
110 // Required resources. 253 // Required resources.
111 html_source->SetJsonPath("strings.js"); 254 html_source->SetJsonPath("strings.js");
112 html_source->AddResourcePath("offline_internals.css", 255 html_source->AddResourcePath("offline_internals.css",
113 IDR_OFFLINE_INTERNALS_CSS); 256 IDR_OFFLINE_INTERNALS_CSS);
114 html_source->AddResourcePath("offline_internals.js", 257 html_source->AddResourcePath("offline_internals.js",
115 IDR_OFFLINE_INTERNALS_JS); 258 IDR_OFFLINE_INTERNALS_JS);
116 html_source->SetDefaultResource(IDR_OFFLINE_INTERNALS_HTML); 259 html_source->SetDefaultResource(IDR_OFFLINE_INTERNALS_HTML);
117 260
118 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source); 261 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source);
119 262
120 web_ui->AddMessageHandler(new OfflineInternalsUIMessageHandler()); 263 web_ui->AddMessageHandler(new OfflineInternalsUIMessageHandler());
121 } 264 }
122 265
123 OfflineInternalsUI::~OfflineInternalsUI() {} 266 OfflineInternalsUI::~OfflineInternalsUI() {}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698