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