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

Side by Side Diff: content/browser/devtools/renderer_overrides_handler.cc

Issue 23240002: Backend for DevTools quota managements. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 "content/browser/devtools/renderer_overrides_handler.h" 5 #include "content/browser/devtools/renderer_overrides_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/barrier_closure.h"
9 #include "base/base64.h" 10 #include "base/base64.h"
10 #include "base/bind.h" 11 #include "base/bind.h"
11 #include "base/bind_helpers.h" 12 #include "base/bind_helpers.h"
12 #include "base/files/file_path.h" 13 #include "base/files/file_path.h"
14 #include "base/message_loop/message_loop_proxy.h"
13 #include "base/strings/string16.h" 15 #include "base/strings/string16.h"
14 #include "base/values.h" 16 #include "base/values.h"
15 #include "content/browser/child_process_security_policy_impl.h" 17 #include "content/browser/child_process_security_policy_impl.h"
16 #include "content/browser/devtools/devtools_protocol_constants.h" 18 #include "content/browser/devtools/devtools_protocol_constants.h"
17 #include "content/browser/devtools/devtools_tracing_handler.h" 19 #include "content/browser/devtools/devtools_tracing_handler.h"
18 #include "content/browser/renderer_host/dip_util.h" 20 #include "content/browser/renderer_host/dip_util.h"
19 #include "content/browser/renderer_host/render_view_host_delegate.h" 21 #include "content/browser/renderer_host/render_view_host_delegate.h"
20 #include "content/browser/renderer_host/render_view_host_impl.h" 22 #include "content/browser/renderer_host/render_view_host_impl.h"
21 #include "content/common/view_messages.h" 23 #include "content/common/view_messages.h"
22 #include "content/port/browser/render_widget_host_view_port.h" 24 #include "content/port/browser/render_widget_host_view_port.h"
23 #include "content/public/browser/browser_thread.h" 25 #include "content/public/browser/browser_thread.h"
24 #include "content/public/browser/devtools_agent_host.h" 26 #include "content/public/browser/devtools_agent_host.h"
25 #include "content/public/browser/javascript_dialog_manager.h" 27 #include "content/public/browser/javascript_dialog_manager.h"
26 #include "content/public/browser/navigation_controller.h" 28 #include "content/public/browser/navigation_controller.h"
27 #include "content/public/browser/navigation_entry.h" 29 #include "content/public/browser/navigation_entry.h"
28 #include "content/public/browser/render_process_host.h" 30 #include "content/public/browser/render_process_host.h"
29 #include "content/public/browser/render_view_host.h" 31 #include "content/public/browser/render_view_host.h"
30 #include "content/public/browser/render_widget_host_view.h" 32 #include "content/public/browser/render_widget_host_view.h"
33 #include "content/public/browser/storage_partition.h"
31 #include "content/public/browser/web_contents.h" 34 #include "content/public/browser/web_contents.h"
32 #include "content/public/browser/web_contents_delegate.h" 35 #include "content/public/browser/web_contents_delegate.h"
33 #include "content/public/common/page_transition_types.h" 36 #include "content/public/common/page_transition_types.h"
34 #include "content/public/common/referrer.h" 37 #include "content/public/common/referrer.h"
35 #include "ipc/ipc_sender.h" 38 #include "ipc/ipc_sender.h"
39 #include "net/base/net_util.h"
36 #include "third_party/WebKit/public/web/WebInputEvent.h" 40 #include "third_party/WebKit/public/web/WebInputEvent.h"
37 #include "ui/gfx/codec/jpeg_codec.h" 41 #include "ui/gfx/codec/jpeg_codec.h"
38 #include "ui/gfx/codec/png_codec.h" 42 #include "ui/gfx/codec/png_codec.h"
39 #include "ui/gfx/size_conversions.h" 43 #include "ui/gfx/size_conversions.h"
40 #include "ui/snapshot/snapshot.h" 44 #include "ui/snapshot/snapshot.h"
41 #include "url/gurl.h" 45 #include "url/gurl.h"
46 #include "webkit/browser/quota/quota_manager.h"
42 47
43 using WebKit::WebGestureEvent; 48 using WebKit::WebGestureEvent;
44 using WebKit::WebInputEvent; 49 using WebKit::WebInputEvent;
45 using WebKit::WebMouseEvent; 50 using WebKit::WebMouseEvent;
46 51
47 namespace content { 52 namespace content {
48 53
49 namespace { 54 namespace {
50 55
51 static const char kPng[] = "png"; 56 static const char kPng[] = "png";
(...skipping 13 matching lines...) Expand all
65 if (modifiers & 4) 70 if (modifiers & 4)
66 event->modifiers |= WebInputEvent::MetaKey; 71 event->modifiers |= WebInputEvent::MetaKey;
67 if (modifiers & 8) 72 if (modifiers & 8)
68 event->modifiers |= WebInputEvent::ShiftKey; 73 event->modifiers |= WebInputEvent::ShiftKey;
69 } 74 }
70 75
71 params->GetDouble(devtools::Input::kParamTimestamp, 76 params->GetDouble(devtools::Input::kParamTimestamp,
72 &event->timeStampSeconds); 77 &event->timeStampSeconds);
73 } 78 }
74 79
80 typedef base::Callback<void (DevToolsProtocol::Response*)> RespondCallback;
81
82 class QuotaTask {
83 public:
84 virtual ~QuotaTask() {}
85
86 static void Run(scoped_ptr<QuotaTask> task);
87
88 protected:
89 QuotaTask(scoped_refptr<DevToolsProtocol::Command> command,
90 const RespondCallback& callback,
91 RenderViewHost* render_vew_host,
92 const std::string& security_origin);
93
94 scoped_refptr<quota::QuotaManager> GetQuotaManager() {
pfeldman 2013/09/17 15:19:45 These will not be needed.
SeRya 2013/09/17 16:12:13 Done.
95 return quota_manager_;
96 }
97
98 std::string host() const { return net::GetHostOrSpecFromURL(origin_); }
99 const GURL& origin() const { return origin_; }
100
101 void AddStep(base::Closure const& step) { steps_.push_back(step); }
102
103 void StepDone();
104 virtual scoped_ptr<base::DictionaryValue> GetResponseData() = 0;
105
106 private:
107 scoped_refptr<DevToolsProtocol::Command> command_;
108 RespondCallback callback_;
109
110 GURL origin_;
111 scoped_refptr<quota::QuotaManager> quota_manager_;
112
113 scoped_refptr<base::MessageLoopProxy> response_loop_proxy_;
114
115 std::vector<base::Closure> steps_;
116 base::Closure barrier_;
117
118 // Called on IO thread.
119 void TaskStart();
120 void TaskDone();
121
122 void RespondOnCallerThread(scoped_ptr<base::DictionaryValue> response);
123 static void RespondOnCallerThreadAndDelete(
124 QuotaTask* task,
125 scoped_ptr<base::DictionaryValue> responseData);
126 };
127
128 class GetUsageAndQuotaTask : public QuotaTask {
129 public:
130 GetUsageAndQuotaTask(scoped_refptr<DevToolsProtocol::Command> command,
131 const RespondCallback& callback,
132 RenderViewHost* render_vew_host,
133 const std::string& security_origin);
134
135 private:
136 scoped_ptr<base::DictionaryValue> quota_;
137 scoped_ptr<base::DictionaryValue> usage_;
138
139 virtual scoped_ptr<base::DictionaryValue> GetResponseData() OVERRIDE;
140 void GetHostUsage(quota::StorageType type,
141 quota::QuotaClient::ID client_id, const char* name);
142 void DidGetQuota(
143 const char* name, quota::QuotaStatusCode status, int64 space);
144 quota::QuotaCallback MakeQuotaCallback(const char* name);
145 void DidGetUsage(const char* name, int64 usage_value);
146 void DidGetUsageAndQuotaForWebApps(const char* name,
147 quota::QuotaStatusCode status, int64 usage, int64 quota);
148 void AddGetHostUsageStep(
149 quota::StorageType type,
150 quota::QuotaClient::ID client_id,
151 const char* name);
152 };
153
75 } // namespace 154 } // namespace
76 155
77 RendererOverridesHandler::RendererOverridesHandler(DevToolsAgentHost* agent) 156 RendererOverridesHandler::RendererOverridesHandler(DevToolsAgentHost* agent)
78 : agent_(agent), 157 : agent_(agent),
79 weak_factory_(this) { 158 weak_factory_(this) {
80 RegisterCommandHandler( 159 RegisterCommandHandler(
81 devtools::DOM::setFileInputFiles::kName, 160 devtools::DOM::setFileInputFiles::kName,
82 base::Bind( 161 base::Bind(
83 &RendererOverridesHandler::GrantPermissionsForSetFileInputFiles, 162 &RendererOverridesHandler::GrantPermissionsForSetFileInputFiles,
84 base::Unretained(this))); 163 base::Unretained(this)));
(...skipping 30 matching lines...) Expand all
115 devtools::Page::startScreencast::kName, 194 devtools::Page::startScreencast::kName,
116 base::Bind( 195 base::Bind(
117 &RendererOverridesHandler::PageStartScreencast, 196 &RendererOverridesHandler::PageStartScreencast,
118 base::Unretained(this))); 197 base::Unretained(this)));
119 RegisterCommandHandler( 198 RegisterCommandHandler(
120 devtools::Page::stopScreencast::kName, 199 devtools::Page::stopScreencast::kName,
121 base::Bind( 200 base::Bind(
122 &RendererOverridesHandler::PageStopScreencast, 201 &RendererOverridesHandler::PageStopScreencast,
123 base::Unretained(this))); 202 base::Unretained(this)));
124 RegisterCommandHandler( 203 RegisterCommandHandler(
204 devtools::Page::queryUsageAndQuota::kName,
205 base::Bind(
206 &RendererOverridesHandler::PageQueryUsageAndQuota,
207 base::Unretained(this)));
208 RegisterCommandHandler(
125 devtools::Input::dispatchMouseEvent::kName, 209 devtools::Input::dispatchMouseEvent::kName,
126 base::Bind( 210 base::Bind(
127 &RendererOverridesHandler::InputDispatchMouseEvent, 211 &RendererOverridesHandler::InputDispatchMouseEvent,
128 base::Unretained(this))); 212 base::Unretained(this)));
129 RegisterCommandHandler( 213 RegisterCommandHandler(
130 devtools::Input::dispatchGestureEvent::kName, 214 devtools::Input::dispatchGestureEvent::kName,
131 base::Bind( 215 base::Bind(
132 &RendererOverridesHandler::InputDispatchGestureEvent, 216 &RendererOverridesHandler::InputDispatchGestureEvent,
133 base::Unretained(this))); 217 base::Unretained(this)));
134 } 218 }
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 metadata.viewport_size.height()); 601 metadata.viewport_size.height());
518 response->Set(devtools::Page::kParamViewport, viewport); 602 response->Set(devtools::Page::kParamViewport, viewport);
519 } 603 }
520 604
521 if (command) { 605 if (command) {
522 SendAsyncResponse(command->SuccessResponse(response)); 606 SendAsyncResponse(command->SuccessResponse(response));
523 } else { 607 } else {
524 SendNotification(devtools::Page::screencastFrame::kName, response); 608 SendNotification(devtools::Page::screencastFrame::kName, response);
525 } 609 }
526 } 610 }
527 611
pfeldman 2013/09/17 15:19:45 } // QuotaTask ---------------------------------
SeRya 2013/09/17 16:12:13 Done.
612 // static
613 void QuotaTask::Run(scoped_ptr<QuotaTask> task) {
614 // Will be deleted when done.
615 BrowserThread::PostTask(
616 BrowserThread::IO, FROM_HERE,
617 base::Bind(&QuotaTask::TaskStart, base::Unretained(task.release())));
618 }
619
620 QuotaTask::QuotaTask(
621 scoped_refptr<DevToolsProtocol::Command> command,
622 const RespondCallback& callback,
623 RenderViewHost* render_vew_host,
624 const std::string& security_origin)
625 : command_(command),
626 callback_(callback),
627 origin_(security_origin),
628 quota_manager_(render_vew_host->GetProcess()->
629 GetStoragePartition()->GetQuotaManager()),
630 response_loop_proxy_(base::MessageLoopProxy::current()) {
631 }
632
633 void QuotaTask::TaskStart() {
634 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
635
636 barrier_ = base::BarrierClosure(
637 steps_.size(),
638 base::Bind(&QuotaTask::TaskDone, base::Unretained(this)));
639
640 for (std::vector<base::Closure>::iterator i = steps_.begin();
641 i != steps_.end(); ++i) {
642 i->Run();
643 }
644 }
645
646 void QuotaTask::StepDone() {
647 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
648
649 barrier_.Run();
650 }
651
652 void QuotaTask::TaskDone() {
653 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
654
655 scoped_ptr<base::DictionaryValue> responseData = GetResponseData();
656
657 base::MessageLoopProxy* loop = response_loop_proxy_.get();
658 loop->PostTask(FROM_HERE, base::Bind(
659 &QuotaTask::RespondOnCallerThreadAndDelete,
660 this, base::Passed(&responseData)));
661 }
662
663 void QuotaTask::RespondOnCallerThread(
664 scoped_ptr<base::DictionaryValue> response) {
665 callback_.Run(command_->SuccessResponse(response.release()).get());
666 }
667
668 // static
669 void QuotaTask::RespondOnCallerThreadAndDelete(
670 QuotaTask* task,
671 scoped_ptr<base::DictionaryValue> responseData) {
672 task->RespondOnCallerThread(responseData.Pass());
673 delete task;
674 }
675
676 GetUsageAndQuotaTask::GetUsageAndQuotaTask(
677 scoped_refptr<DevToolsProtocol::Command> command,
678 const RespondCallback& callback,
679 RenderViewHost* render_vew_host,
680 const std::string& security_origin)
681 : QuotaTask(command, callback, render_vew_host, security_origin),
682 quota_(new base::DictionaryValue),
683 usage_(new base::DictionaryValue) {
684 AddStep(base::Bind(&quota::QuotaManager::GetAvailableSpace,
685 GetQuotaManager(),
686 MakeQuotaCallback("availableSpace")));
687
688 AddStep(base::Bind(
689 &quota::QuotaManager::GetUsageAndQuotaForWebApps,
690 GetQuotaManager(),
691 origin(),
692 quota::kStorageTypeTemporary,
693 base::Bind(&GetUsageAndQuotaTask::DidGetUsageAndQuotaForWebApps,
694 base::Unretained(this), "temporaryHostQuota")));
695
696 AddStep(base::Bind(&quota::QuotaManager::GetPersistentHostQuota,
697 GetQuotaManager(),
698 host(),
699 MakeQuotaCallback("persistentHostQuota")));
700
701 AddGetHostUsageStep(
702 quota::kStorageTypeTemporary,
703 quota::QuotaClient::kFileSystem,
704 "temporaryFileSystemUsage");
705
706 AddGetHostUsageStep(
707 quota::kStorageTypePersistent,
708 quota::QuotaClient::kFileSystem,
709 "persistentFileSystemUsage");
710
711 AddGetHostUsageStep(
712 quota::kStorageTypeSyncable,
713 quota::QuotaClient::kFileSystem,
714 "syncableFileSystemUsage");
715
716 AddGetHostUsageStep(
717 quota::kStorageTypeTemporary,
718 quota::QuotaClient::kDatabase,
719 "databaseUsage");
720
721 AddGetHostUsageStep(
722 quota::kStorageTypeTemporary,
723 quota::QuotaClient::kAppcache,
724 "appcacheUsage");
725
726 AddGetHostUsageStep(
727 quota::kStorageTypeTemporary,
728 quota::QuotaClient::kIndexedDatabase,
729 "indexedDatabaseUsage");
730 }
731
732 void GetUsageAndQuotaTask::AddGetHostUsageStep(
733 quota::StorageType type,
734 quota::QuotaClient::ID client_id,
735 const char* name) {
736 AddStep(base::Bind(&GetUsageAndQuotaTask::GetHostUsage,
pfeldman 2013/09/17 15:19:45 Why do you need to collect steps and not simply ru
SeRya 2013/09/17 16:12:13 BarrierClosure needs to be created before running
737 base::Unretained(this), type, client_id, name));
738 }
739
740 scoped_ptr<base::DictionaryValue> GetUsageAndQuotaTask::GetResponseData() {
741 scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue);
742 result->Set("quota", quota_.release());
743 result->Set("usage", usage_.release());
744 return result.Pass();
745 }
746
747 void GetUsageAndQuotaTask::GetHostUsage(
748 quota::StorageType type,
749 quota::QuotaClient::ID client_id,
750 const char* name) {
751 quota::UsageCallback callback =
752 base::Bind(&GetUsageAndQuotaTask::DidGetUsage,
753 base::Unretained(this), name);
754 GetQuotaManager()->GetHostUsage(host(), type, client_id, callback);
755 }
756
757 void GetUsageAndQuotaTask::DidGetQuota(
758 const char* name,
759 quota::QuotaStatusCode status,
760 int64 space) {
761 if (status == quota::kQuotaStatusOk)
762 quota_->SetDouble(name, space);
763 StepDone();
764 }
765
766 quota::QuotaCallback GetUsageAndQuotaTask::MakeQuotaCallback(const char* name) {
767 return base::Bind(&GetUsageAndQuotaTask::DidGetQuota,
768 base::Unretained(this), name);
769 }
770
771 void GetUsageAndQuotaTask::DidGetUsage(const char* name, int64 usage_value) {
772 usage_->SetDouble(name, usage_value);
773 StepDone();
774 }
775
776 void GetUsageAndQuotaTask::DidGetUsageAndQuotaForWebApps(
777 const char* name,
778 quota::QuotaStatusCode status,
779 int64 usage,
780 int64 quota) {
781 if (status == quota::kQuotaStatusOk)
782 quota_->SetDouble(name, quota);
783 StepDone();
784 }
785
786 scoped_refptr<DevToolsProtocol::Response>
787 RendererOverridesHandler::PageQueryUsageAndQuota(
788 scoped_refptr<DevToolsProtocol::Command> command) {
789 base::DictionaryValue* params = command->params();
790 std::string security_origin;
791 if (!params || !params->GetString(
792 devtools::Page::queryUsageAndQuota::kParamSecurityOrigin,
793 &security_origin)) {
794 return command->InvalidParamResponse(
795 devtools::Page::queryUsageAndQuota::kParamSecurityOrigin);
796 }
797
798 RespondCallback callback = base::Bind(
799 &RendererOverridesHandler::AsyncTaskDone, weak_factory_.GetWeakPtr());
800 QuotaTask::Run(scoped_ptr<QuotaTask>(new GetUsageAndQuotaTask(command,
801 callback, agent_->GetRenderViewHost(), security_origin)));
802 return command->AsyncResponsePromise();
803 }
804
805 void RendererOverridesHandler::AsyncTaskDone(
806 DevToolsProtocol::Response* response) {
807 SendRawMessage(response->Serialize());
808 }
528 809
529 // Input agent handlers ------------------------------------------------------ 810 // Input agent handlers ------------------------------------------------------
530 811
531 scoped_refptr<DevToolsProtocol::Response> 812 scoped_refptr<DevToolsProtocol::Response>
532 RendererOverridesHandler::InputDispatchMouseEvent( 813 RendererOverridesHandler::InputDispatchMouseEvent(
533 scoped_refptr<DevToolsProtocol::Command> command) { 814 scoped_refptr<DevToolsProtocol::Command> command) {
534 base::DictionaryValue* params = command->params(); 815 base::DictionaryValue* params = command->params();
535 if (!params) 816 if (!params)
536 return NULL; 817 return NULL;
537 818
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 return NULL; 945 return NULL;
665 } 946 }
666 event.data.pinchUpdate.scale = static_cast<float>(scale); 947 event.data.pinchUpdate.scale = static_cast<float>(scale);
667 } 948 }
668 949
669 host->ForwardGestureEvent(event); 950 host->ForwardGestureEvent(event);
670 return command->SuccessResponse(NULL); 951 return command->SuccessResponse(NULL);
671 } 952 }
672 953
673 } // namespace content 954 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698