Index: chrome/browser/permissions/permission_infobar_request.cc |
diff --git a/chrome/browser/permissions/permission_infobar_request.cc b/chrome/browser/permissions/permission_infobar_request.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b34a554f0f674f58a2a933a0f19f50d0d174342e |
--- /dev/null |
+++ b/chrome/browser/permissions/permission_infobar_request.cc |
@@ -0,0 +1,174 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/permissions/permission_infobar_request.h" |
+ |
+#include "base/prefs/pref_service.h" |
+#include "chrome/browser/geolocation/geolocation_infobar_delegate.h" |
+#include "chrome/browser/infobars/infobar_service.h" |
+#include "chrome/browser/media/midi_permission_infobar_delegate.h" |
+#include "chrome/browser/notifications/notification_permission_infobar_delegate.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/storage/durable_storage_permission_infobar_delegate.h" |
+#include "chrome/common/pref_names.h" |
+#include "components/content_settings/core/browser/host_content_settings_map.h" |
+#include "components/infobars/core/infobar.h" |
+#include "content/public/browser/browser_thread.h" |
+ |
+#if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
+#include "chrome/browser/media/protected_media_identifier_infobar_delegate.h" |
+#endif |
mlamouri (slow - plz ping)
2015/09/16 16:21:01
Do we expect to use this code in other platforms t
Lalit Maganti
2015/09/16 17:28:38
Interesting question. I'm not sure. I assume becau
|
+ |
+PermissionInfoBarRequest::PermissionRequest::PermissionRequest( |
+ ContentSettingsType type, |
+ const PermissionDecidedCallback& user_callback, |
+ const PermissionDecidedCallback& non_user_callback) |
+ : type_(type), |
+ user_callback_(user_callback), |
+ non_user_callback_(non_user_callback) { |
+} |
+ |
+PermissionInfoBarRequest::PermissionRequest::~PermissionRequest() { |
+} |
+ |
+PermissionInfoBarRequest::PermissionInfoBarRequest( |
+ const GURL& requesting_frame, |
+ const GURL& embedding_frame) |
+ : infobar_(nullptr), |
+ requesting_frame_(requesting_frame), |
+ embedding_frame_(embedding_frame), |
+ weak_factory_(this) { |
+} |
+ |
+PermissionInfoBarRequest::~PermissionInfoBarRequest() { |
+} |
+ |
+void PermissionInfoBarRequest::AddPermission( |
+ const ContentSettingsType type, |
+ const PermissionDecidedCallback& user_callback, |
+ const PermissionDecidedCallback& non_user_callback) { |
+ requests_.emplace_back(type, user_callback, non_user_callback); |
+} |
+ |
+bool PermissionInfoBarRequest::ShowInfobar( |
+ InfoBarService* infobar_service, |
+ Profile* profile, |
+ const base::Closure& manager_callback) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ |
+ // After pruning if there is nothing left then just ignore this request. |
+ PruneAnsweredPermissions(profile); |
+ if (requests_.size() == 0) |
+ return false; |
+ |
+ std::string display_languages = |
+ profile->GetPrefs()->GetString(prefs::kAcceptLanguages); |
+ if (requests_.size() == 1) { |
+ CreateInfoBar( |
+ infobar_service, |
+ requests_[0], |
+ display_languages, |
+ base::Bind(&PermissionInfoBarRequest::OnPermissionSet, |
+ weak_factory_.GetWeakPtr(), |
+ manager_callback)); |
+ return true; |
+ } |
+ |
+ // TODO(lalitm) once multiple permissions is ready to land, this |
+ // should be implemented properly. |
+ NOTIMPLEMENTED(); |
+ for (size_t i = 0; i < requests_.size(); ++i) |
+ requests_[i].non_user_callback().Run(false, CONTENT_SETTING_DEFAULT); |
+ return false; |
+} |
+ |
+void PermissionInfoBarRequest::Cancel() { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ DCHECK(infobar_); |
+ |
+ infobar_->RemoveSelf(); |
+} |
+ |
+void PermissionInfoBarRequest::OnPermissionSet( |
+ const base::Closure& manager_callback, |
+ bool update_content_setting, |
+ bool allowed) { |
+ OnPermissionsSet(manager_callback, update_content_setting, |
+ std::vector<ContentSetting>(1, |
+ allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK)); |
+} |
+ |
+void PermissionInfoBarRequest::OnPermissionsSet( |
+ const base::Closure& manager_callback, |
+ bool update_content_setting, |
+ const std::vector<ContentSetting>& allowed) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ |
+ // Set the infobar to nullptr so there is no attempt to remove it later. |
+ infobar_ = nullptr; |
+ |
+ for (size_t i = 0; i < requests_.size(); ++i) { |
+ requests_[i].user_callback() |
+ .Run(update_content_setting, |
+ update_content_setting ? allowed[i] : CONTENT_SETTING_DEFAULT); |
+ } |
+ manager_callback.Run(); |
+} |
+ |
+void PermissionInfoBarRequest::PruneAnsweredPermissions( |
+ Profile* profile) { |
+ for (auto it = requests_.begin(); it != requests_.end();) { |
+ ContentSetting content_setting = profile-> |
+ GetHostContentSettingsMap()->GetContentSettingAndMaybeUpdateLastUsage( |
+ requesting_frame_, embedding_frame_, it->type(), std::string()); |
+ if (content_setting == CONTENT_SETTING_ALLOW || |
+ content_setting == CONTENT_SETTING_BLOCK) { |
+ it->non_user_callback().Run(true, content_setting); |
+ it = requests_.erase(it); |
+ } else { |
+ ++it; |
+ } |
+ } |
+} |
+ |
+void PermissionInfoBarRequest::CreateInfoBar( |
+ InfoBarService* infobar_service, |
+ const PermissionRequest& request, |
+ const std::string& display_languages, |
+ const PermissionInfobarDelegate::PermissionSetCallback& callback) { |
+ switch (request.type()) { |
+ case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
+ infobar_ = GeolocationInfoBarDelegate::Create( |
+ infobar_service, requesting_frame_, |
+ display_languages, callback); |
+ break; |
+#if defined(ENABLE_NOTIFICATIONS) |
+ case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
+ infobar_ = NotificationPermissionInfobarDelegate::Create( |
+ infobar_service, requesting_frame_, |
+ display_languages, callback); |
+ break; |
+#endif // ENABLE_NOTIFICATIONS |
+ case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: |
+ infobar_ = MidiPermissionInfoBarDelegate::Create( |
+ infobar_service, requesting_frame_, |
+ display_languages, request.type(), callback); |
+ break; |
+#if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
+ case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: |
+ infobar_ = ProtectedMediaIdentifierInfoBarDelegate::Create( |
+ infobar_service, requesting_frame_, |
+ display_languages, callback); |
+ break; |
+#endif |
+ case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: |
+ infobar_ = DurableStoragePermissionInfoBarDelegate::Create( |
+ infobar_service, requesting_frame_, |
+ display_languages, request.type(), callback); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+} |