15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_quota_permission_context.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/website_settings/permission_bubble_manager.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/website_settings/permission_bubble_request.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/locale_settings.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/infobars/core/confirm_infobar_delegate.h" 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/theme_resources.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/quota/quota_types.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// If the site requested larger quota than this threshold, show a different 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// message to the user. 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int64 kRequestLargeQuotaThreshold = 5 * 1024 * 1024; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// QuotaPermissionRequest --------------------------------------------- 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class QuotaPermissionRequest : public PermissionBubbleRequest { 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuotaPermissionRequest( 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChromeQuotaPermissionContext* context, 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& origin_url, 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 requested_quota, 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool user_gesture, 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& display_languages, 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const content::QuotaPermissionContext::PermissionCallback& callback); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~QuotaPermissionRequest(); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // PermissionBubbleRequest: 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual int GetIconID() const OVERRIDE; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual base::string16 GetMessageText() const OVERRIDE; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual base::string16 GetMessageTextFragment() const OVERRIDE; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool HasUserGesture() const OVERRIDE; 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual GURL GetRequestingHostname() const OVERRIDE; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void PermissionGranted() OVERRIDE; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void PermissionDenied() OVERRIDE; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Cancelled() OVERRIDE; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void RequestFinished() OVERRIDE; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<ChromeQuotaPermissionContext> context_; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL origin_url_; 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string display_languages_; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 requested_quota_; 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool user_gesture_; 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::QuotaPermissionContext::PermissionCallback callback_; 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(QuotaPermissionRequest); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuotaPermissionRequest::QuotaPermissionRequest( 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChromeQuotaPermissionContext* context, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& origin_url, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 requested_quota, 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool user_gesture, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& display_languages, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const content::QuotaPermissionContext::PermissionCallback& callback) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : context_(context), 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origin_url_(origin_url), 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display_languages_(display_languages), 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) requested_quota_(requested_quota), 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch user_gesture_(user_gesture), 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_(callback) {} 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuotaPermissionRequest::~QuotaPermissionRequest() {} 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int QuotaPermissionRequest::GetIconID() const { 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(gbillock): get the proper image here 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IDR_INFOBAR_WARNING; 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 QuotaPermissionRequest::GetMessageText() const { 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return l10n_util::GetStringFUTF16( 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (requested_quota_ > kRequestLargeQuotaThreshold ? 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_REQUEST_LARGE_QUOTA_INFOBAR_QUESTION : 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_REQUEST_QUOTA_INFOBAR_QUESTION), 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::FormatUrl(origin_url_, display_languages_, 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::kFormatUrlOmitUsernamePassword | 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::kFormatUrlOmitTrailingSlashOnBareHostname, 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::UnescapeRule::SPACES, NULL, NULL, NULL) 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ); 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 QuotaPermissionRequest::GetMessageTextFragment() const { 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_REQUEST_QUOTA_PERMISSION_FRAGMENT); 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool QuotaPermissionRequest::HasUserGesture() const { 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return user_gesture_; 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)GURL QuotaPermissionRequest::GetRequestingHostname() const { 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return origin_url_; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaPermissionRequest::PermissionGranted() { 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_->DispatchCallbackOnIOThread( 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_, 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_ALLOW); 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_ = content::QuotaPermissionContext::PermissionCallback(); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaPermissionRequest::PermissionDenied() { 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_->DispatchCallbackOnIOThread( 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_DISALLOW); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_ = content::QuotaPermissionContext::PermissionCallback(); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaPermissionRequest::Cancelled() { 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaPermissionRequest::RequestFinished() { 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!callback_.is_null()) { 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_->DispatchCallbackOnIOThread( 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_, 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_CANCELLED); 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete this; 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// RequestQuotaInfoBarDelegate ------------------------------------------------ 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequestQuotaInfoBarDelegate : public ConfirmInfoBarDelegate { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Creates a request quota infobar and delegate and adds the infobar to 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |infobar_service|. 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void Create( 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService* infobar_service, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChromeQuotaPermissionContext* context, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& origin_url, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 requested_quota, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& display_languages, 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::QuotaPermissionContext::PermissionCallback& callback); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestQuotaInfoBarDelegate( 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeQuotaPermissionContext* context, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin_url, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 requested_quota, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& display_languages, 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::QuotaPermissionContext::PermissionCallback& callback); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~RequestQuotaInfoBarDelegate(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ConfirmInfoBarDelegate: 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetMessageText() const OVERRIDE; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Accept() OVERRIDE; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Cancel() OVERRIDE; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeQuotaPermissionContext> context_; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin_url_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string display_languages_; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 requested_quota_; 1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::QuotaPermissionContext::PermissionCallback callback_; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RequestQuotaInfoBarDelegate); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RequestQuotaInfoBarDelegate::Create( 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService* infobar_service, 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChromeQuotaPermissionContext* context, 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& origin_url, 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 requested_quota, 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& display_languages, 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::QuotaPermissionContext::PermissionCallback& callback) { 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_service->AddInfoBar(ConfirmInfoBarDelegate::CreateInfoBar( 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ConfirmInfoBarDelegate>(new RequestQuotaInfoBarDelegate( 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) context, origin_url, requested_quota, display_languages, callback)))); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RequestQuotaInfoBarDelegate::RequestQuotaInfoBarDelegate( 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ChromeQuotaPermissionContext* context, 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& origin_url, 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 requested_quota, 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& display_languages, 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::QuotaPermissionContext::PermissionCallback& callback) 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : ConfirmInfoBarDelegate(), 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context_(context), 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin_url_(origin_url), 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_languages_(display_languages), 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) requested_quota_(requested_quota), 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback_(callback) { 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RequestQuotaInfoBarDelegate::~RequestQuotaInfoBarDelegate() { 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!callback_.is_null()) { 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context_->DispatchCallbackOnIOThread( 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback_, 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_CANCELLED); 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 RequestQuotaInfoBarDelegate::GetMessageText() const { 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // If the site requested larger quota than this threshold, show a different 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // message to the user. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringFUTF16( 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (requested_quota_ > kRequestLargeQuotaThreshold ? 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_REQUEST_LARGE_QUOTA_INFOBAR_QUESTION : 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_REQUEST_QUOTA_INFOBAR_QUESTION), 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::FormatUrl(origin_url_, display_languages_, 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::kFormatUrlOmitUsernamePassword | 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::kFormatUrlOmitTrailingSlashOnBareHostname, 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::UnescapeRule::SPACES, NULL, NULL, NULL) 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RequestQuotaInfoBarDelegate::Accept() { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_->DispatchCallbackOnIOThread( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_, 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_ALLOW); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RequestQuotaInfoBarDelegate::Cancel() { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_->DispatchCallbackOnIOThread( 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_, 2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_CANCELLED); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ChromeQuotaPermissionContext ----------------------------------------------- 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochChromeQuotaPermissionContext::ChromeQuotaPermissionContext() { 2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeQuotaPermissionContext::RequestQuotaPermission( 255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const content::StorageQuotaParams& params, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PermissionCallback& callback) { 25803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (params.storage_type != storage::kStorageTypePersistent) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For now we only support requesting quota with this interface 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for Persistent storage type. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(QUOTA_PERMISSION_RESPONSE_DISALLOW); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { 2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserThread::PostTask( 2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserThread::UI, FROM_HERE, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ChromeQuotaPermissionContext::RequestQuotaPermission, this, 269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params, render_process_id, callback)); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::WebContents* web_contents = 274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch tab_util::GetWebContentsByID(render_process_id, 275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.render_view_id); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!web_contents) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tab may have gone away or the request may not be from a tab. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Attempt to request quota tabless renderer: " 279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch << render_process_id << "," << params.render_view_id; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchCallbackOnIOThread(callback, QUOTA_PERMISSION_RESPONSE_CANCELLED); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (PermissionBubbleManager::Enabled()) { 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PermissionBubbleManager* bubble_manager = 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PermissionBubbleManager::FromWebContents(web_contents); 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (bubble_manager) { 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bubble_manager->AddRequest(new QuotaPermissionRequest(this, 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.origin_url, params.requested_size, params.user_gesture, 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext())-> 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetPrefs()->GetString(prefs::kAcceptLanguages), 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback)); 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService* infobar_service = 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService::FromWebContents(web_contents); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!infobar_service) { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The tab has no infobar service. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Attempt to request quota from a background page: " 302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch << render_process_id << "," << params.render_view_id; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchCallbackOnIOThread(callback, QUOTA_PERMISSION_RESPONSE_CANCELLED); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestQuotaInfoBarDelegate::Create( 307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch infobar_service, this, params.origin_url, params.requested_size, 3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Profile::FromBrowserContext(web_contents->GetBrowserContext())-> 3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetPrefs()->GetString(prefs::kAcceptLanguages), 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeQuotaPermissionContext::DispatchCallbackOnIOThread( 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PermissionCallback& callback, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuotaPermissionResponse response) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(false, callback.is_null()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)) { 3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserThread::PostTask( 3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserThread::IO, FROM_HERE, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ChromeQuotaPermissionContext::DispatchCallbackOnIOThread, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, callback, response)); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(response); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeQuotaPermissionContext::~ChromeQuotaPermissionContext() {} 330