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