1bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Copyright 2013 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)
5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/browser/quota_dispatcher_host.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/numerics/safe_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/quota_messages.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/quota_permission_context.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::QuotaClient;
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::QuotaManager;
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::QuotaStatusCode;
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::StorageType;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Created one per request to carry the request's request_id around.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dispatches requests from renderer/worker to the QuotaManager and
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sends back the response to the renderer/worker.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuotaDispatcherHost::RequestDispatcher {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RequestDispatcher(base::WeakPtr<QuotaDispatcherHost> dispatcher_host,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    int request_id)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : dispatcher_host_(dispatcher_host),
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        render_process_id_(dispatcher_host->process_id_),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id_(request_id) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dispatcher_host_->outstanding_requests_.AddWithID(this, request_id_);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RequestDispatcher() {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Subclass must call this when it's done with the request.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Completed() {
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (dispatcher_host_)
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      dispatcher_host_->outstanding_requests_.Remove(request_id_);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  QuotaDispatcherHost* dispatcher_host() const {
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return dispatcher_host_.get();
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::QuotaManager* quota_manager() const {
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return dispatcher_host_ ? dispatcher_host_->quota_manager_ : NULL;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuotaPermissionContext* permission_context() const {
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return dispatcher_host_ ?
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        dispatcher_host_->permission_context_.get() : NULL;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int render_process_id() const { return render_process_id_; }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id() const { return request_id_; }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::WeakPtr<QuotaDispatcherHost> dispatcher_host_;
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int render_process_id_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuotaDispatcherHost::QueryUsageAndQuotaDispatcher
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public RequestDispatcher {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryUsageAndQuotaDispatcher(
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::WeakPtr<QuotaDispatcherHost> dispatcher_host,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int request_id)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : RequestDispatcher(dispatcher_host, request_id),
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        weak_factory_(this) {}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QueryUsageAndQuotaDispatcher() {}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QueryStorageUsageAndQuota(const GURL& origin, StorageType type) {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    quota_manager()->GetUsageAndQuotaForWebApps(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        origin, type,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&QueryUsageAndQuotaDispatcher::DidQueryStorageUsageAndQuota,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidQueryStorageUsageAndQuota(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaStatusCode status, int64 usage, int64 quota) {
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!dispatcher_host())
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return;
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (status != storage::kQuotaStatusOk) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dispatcher_host()->Send(new QuotaMsg_DidQueryStorageUsageAndQuota(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          request_id(), usage, quota));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Completed();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<QueryUsageAndQuotaDispatcher> weak_factory_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuotaDispatcherHost::RequestQuotaDispatcher
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public RequestDispatcher {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef RequestQuotaDispatcher self_type;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RequestQuotaDispatcher(base::WeakPtr<QuotaDispatcherHost> dispatcher_host,
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                         const StorageQuotaParams& params)
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : RequestDispatcher(dispatcher_host, params.request_id),
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        params_(params),
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        current_usage_(0),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_quota_(0),
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        requested_quota_(0),
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        weak_factory_(this) {
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Convert the requested size from uint64 to int64 since the quota backend
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // requires int64 values.
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(nhiroki): The backend should accept uint64 values.
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    requested_quota_ = base::saturated_cast<int64>(params_.requested_size);
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RequestQuotaDispatcher() {}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Start() {
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(dispatcher_host());
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    DCHECK(params_.storage_type == storage::kStorageTypeTemporary ||
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)           params_.storage_type == storage::kStorageTypePersistent ||
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)           params_.storage_type == storage::kStorageTypeSyncable);
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (params_.storage_type == storage::kStorageTypePersistent) {
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      quota_manager()->GetUsageAndQuotaForWebApps(
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          params_.origin_url, params_.storage_type,
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&self_type::DidGetPersistentUsageAndQuota,
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     weak_factory_.GetWeakPtr()));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      quota_manager()->GetUsageAndQuotaForWebApps(
130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          params_.origin_url, params_.storage_type,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&self_type::DidGetTemporaryUsageAndQuota,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     weak_factory_.GetWeakPtr()));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DidGetPersistentUsageAndQuota(QuotaStatusCode status,
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     int64 usage,
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     int64 quota) {
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!dispatcher_host())
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return;
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (status != storage::kQuotaStatusOk) {
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DidFinish(status, 0, 0);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (quota_manager()->IsStorageUnlimited(params_.origin_url,
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                            params_.storage_type) ||
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        requested_quota_ <= quota) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Seems like we can just let it go.
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      DidFinish(storage::kQuotaStatusOk, usage, params_.requested_size);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    current_usage_ = usage;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_quota_ = quota;
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Otherwise we need to consult with the permission context and
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // possibly show a prompt.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(permission_context());
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    permission_context()->RequestQuotaPermission(params_, render_process_id(),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&self_type::DidGetPermissionResponse,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetTemporaryUsageAndQuota(QuotaStatusCode status,
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    int64 usage,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int64 quota) {
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DidFinish(status, usage, std::min(requested_quota_, quota));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetPermissionResponse(
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaPermissionContext::QuotaPermissionResponse response) {
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!dispatcher_host())
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (response != QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_ALLOW) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // User didn't allow the new quota.  Just returning the current quota.
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      DidFinish(storage::kQuotaStatusOk, current_usage_, current_quota_);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now we're allowed to set the new quota.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager()->SetPersistentHostQuota(
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        net::GetHostOrSpecFromURL(params_.origin_url), params_.requested_size,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&self_type::DidSetHostQuota, weak_factory_.GetWeakPtr()));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidSetHostQuota(QuotaStatusCode status, int64 new_quota) {
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DidFinish(status, current_usage_, new_quota);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DidFinish(QuotaStatusCode status,
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 int64 usage,
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 int64 granted_quota) {
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!dispatcher_host())
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(dispatcher_host());
19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (status != storage::kQuotaStatusOk) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dispatcher_host()->Send(new QuotaMsg_DidGrantStorageQuota(
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          request_id(), usage, granted_quota));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Completed();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  StorageQuotaParams params_;
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 current_usage_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 current_quota_;
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 requested_quota_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<self_type> weak_factory_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuotaDispatcherHost::QuotaDispatcherHost(
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int process_id,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuotaManager* quota_manager,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuotaPermissionContext* permission_context)
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : BrowserMessageFilter(QuotaMsgStart),
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      process_id_(process_id),
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota_manager_(quota_manager),
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      permission_context_(permission_context),
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      weak_factory_(this) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool QuotaDispatcherHost::OnMessageReceived(const IPC::Message& message) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(QuotaDispatcherHost, message)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(QuotaHostMsg_QueryStorageUsageAndQuota,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnQueryStorageUsageAndQuota)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(QuotaHostMsg_RequestStorageQuota,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnRequestStorageQuota)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuotaDispatcherHost::~QuotaDispatcherHost() {}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaDispatcherHost::OnQueryStorageUsageAndQuota(
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int request_id,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StorageType type) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryUsageAndQuotaDispatcher* dispatcher = new QueryUsageAndQuotaDispatcher(
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      weak_factory_.GetWeakPtr(), request_id);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->QueryStorageUsageAndQuota(origin, type);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuotaDispatcherHost::OnRequestStorageQuota(
247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const StorageQuotaParams& params) {
24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (params.storage_type != storage::kStorageTypeTemporary &&
24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      params.storage_type != storage::kStorageTypePersistent) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Unsupported storage types.
251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Send(new QuotaMsg_DidFail(params.request_id,
25203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                              storage::kQuotaErrorNotSupported));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RequestQuotaDispatcher* dispatcher =
257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new RequestQuotaDispatcher(weak_factory_.GetWeakPtr(),
258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                 params);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->Start();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
263