15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef CONTENT_CHILD_QUOTA_DISPATCHER_H_
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define CONTENT_CHILD_QUOTA_DISPATCHER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h"
13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/memory/ref_counted.h"
14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "webkit/child/worker_task_runner.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/quota/quota_types.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Message;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebStorageQuotaCallbacks;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass ThreadSafeSender;
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass QuotaMessageFilter;
31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dispatches and sends quota related messages sent to/from a child
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process from/to the main browser process.  There is one instance
34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// per each thread.  Thread-specific instance can be obtained by
35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// ThreadSpecificInstance().
36558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass QuotaDispatcher : public webkit_glue::WorkerTaskRunner::Observer {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Callback {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Callback() {}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void DidQueryStorageUsageAndQuota(int64 usage, int64 quota) = 0;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void DidGrantStorageQuota(int64 granted_quota) = 0;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void DidFail(quota::QuotaStatusCode status) = 0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  QuotaDispatcher(ThreadSafeSender* thread_safe_sender,
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  QuotaMessageFilter* quota_message_filter);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuotaDispatcher();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // |thread_safe_sender| and |quota_message_filter| are used if
51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // calling this leads to construction.
52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  static QuotaDispatcher* ThreadSpecificInstance(
53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      ThreadSafeSender* thread_safe_sender,
54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      QuotaMessageFilter* quota_message_filter);
55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // webkit_glue::WorkerTaskRunner::Observer implementation.
57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual void OnWorkerRunLoopStopped() OVERRIDE;
58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void OnMessageReceived(const IPC::Message& msg);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QueryStorageUsageAndQuota(const GURL& gurl,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 quota::StorageType type,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Callback* callback);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RequestStorageQuota(int render_view_id,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const GURL& gurl,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           quota::StorageType type,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int64 requested_size,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Callback* callback);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new Callback instance for WebStorageQuotaCallbacks.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Callback* CreateWebStorageQuotaCallbacksWrapper(
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebStorageQuotaCallbacks* callbacks);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidQueryStorageUsageAndQuota(int request_id,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int64 current_usage,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int64 current_quota);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGrantStorageQuota(int request_id,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int64 granted_quota);
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void DidFail(int request_id,
82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch               quota::QuotaStatusCode error);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDMap<Callback, IDMapOwnPointer> pending_quota_callbacks_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_refptr<ThreadSafeSender> thread_safe_sender_;
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_refptr<QuotaMessageFilter> quota_message_filter_;
88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuotaDispatcher);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  // CONTENT_CHILD_QUOTA_DISPATCHER_H_
95