1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_CHILD_QUOTA_DISPATCHER_H_ 6 #define CONTENT_CHILD_QUOTA_DISPATCHER_H_ 7 8 #include <map> 9 #include <set> 10 11 #include "base/basictypes.h" 12 #include "base/id_map.h" 13 #include "base/memory/ref_counted.h" 14 #include "content/child/worker_task_runner.h" 15 #include "webkit/common/quota/quota_types.h" 16 17 class GURL; 18 19 namespace IPC { 20 class Message; 21 } 22 23 namespace blink { 24 class WebStorageQuotaCallbacks; 25 } 26 27 namespace content { 28 29 class ThreadSafeSender; 30 class QuotaMessageFilter; 31 32 // Dispatches and sends quota related messages sent to/from a child 33 // process from/to the main browser process. There is one instance 34 // per each thread. Thread-specific instance can be obtained by 35 // ThreadSpecificInstance(). 36 class QuotaDispatcher : public WorkerTaskRunner::Observer { 37 public: 38 class Callback { 39 public: ~Callback()40 virtual ~Callback() {} 41 virtual void DidQueryStorageUsageAndQuota(int64 usage, int64 quota) = 0; 42 virtual void DidGrantStorageQuota(int64 usage, int64 granted_quota) = 0; 43 virtual void DidFail(quota::QuotaStatusCode status) = 0; 44 }; 45 46 QuotaDispatcher(ThreadSafeSender* thread_safe_sender, 47 QuotaMessageFilter* quota_message_filter); 48 virtual ~QuotaDispatcher(); 49 50 // |thread_safe_sender| and |quota_message_filter| are used if 51 // calling this leads to construction. 52 static QuotaDispatcher* ThreadSpecificInstance( 53 ThreadSafeSender* thread_safe_sender, 54 QuotaMessageFilter* quota_message_filter); 55 56 // WorkerTaskRunner::Observer implementation. 57 virtual void OnWorkerRunLoopStopped() OVERRIDE; 58 59 void OnMessageReceived(const IPC::Message& msg); 60 61 void QueryStorageUsageAndQuota(const GURL& gurl, 62 quota::StorageType type, 63 Callback* callback); 64 void RequestStorageQuota(int render_view_id, 65 const GURL& gurl, 66 quota::StorageType type, 67 uint64 requested_size, 68 Callback* callback); 69 70 // Creates a new Callback instance for WebStorageQuotaCallbacks. 71 static Callback* CreateWebStorageQuotaCallbacksWrapper( 72 blink::WebStorageQuotaCallbacks callbacks); 73 74 private: 75 // Message handlers. 76 void DidQueryStorageUsageAndQuota(int request_id, 77 int64 current_usage, 78 int64 current_quota); 79 void DidGrantStorageQuota(int request_id, 80 int64 current_usage, 81 int64 granted_quota); 82 void DidFail(int request_id, 83 quota::QuotaStatusCode error); 84 85 IDMap<Callback, IDMapOwnPointer> pending_quota_callbacks_; 86 87 scoped_refptr<ThreadSafeSender> thread_safe_sender_; 88 scoped_refptr<QuotaMessageFilter> quota_message_filter_; 89 90 DISALLOW_COPY_AND_ASSIGN(QuotaDispatcher); 91 }; 92 93 } // namespace content 94 95 #endif // CONTENT_CHILD_QUOTA_DISPATCHER_H_ 96