Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5568)

Unified Diff: chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc

Issue 766303003: A private API for the cryptotoken component extension. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: New permission has no ui string, skip in tests Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc
diff --git a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc
new file mode 100644
index 0000000000000000000000000000000000000000..6c475e4cf828b52c58b461e87d9b8bdddcf9fde9
--- /dev/null
+++ b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc
@@ -0,0 +1,133 @@
+// Copyright 2014 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/extensions/api/cryptotoken_private/cryptotoken_private_api.h"
+
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/extensions/api/tabs/tabs_constants.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
+#include "chrome/browser/infobars/infobar_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/infobars/core/confirm_infobar_delegate.h"
+#include "components/infobars/core/infobar.h"
+#include "extensions/common/error_utils.h"
+#include "grit/theme_resources.h"
+#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace extensions {
+namespace api {
+
+namespace {
+
+class CryptotokenPermissionInfoBarDelegate : public ConfirmInfoBarDelegate {
+ public:
+ typedef base::Callback<void(cryptotoken_private::PermissionResult)>
+ InfoBarCallback;
+
+ static void Create(InfoBarService* infobar_service,
+ const base::string16& message,
+ const InfoBarCallback& callback) {
+ infobar_service->AddInfoBar(ConfirmInfoBarDelegate::CreateInfoBar(
+ scoped_ptr<ConfirmInfoBarDelegate>(
+ new CryptotokenPermissionInfoBarDelegate(message, callback))));
+ }
+
+ private:
+ CryptotokenPermissionInfoBarDelegate(const base::string16& message,
+ const InfoBarCallback& callback)
+ : message_(message), callback_(callback), answered_(false) {}
+
+ ~CryptotokenPermissionInfoBarDelegate() override {
+ if (!answered_)
+ callback_.Run(cryptotoken_private::PERMISSION_RESULT_DISMISSED);
+ }
+
+ // ConfirmInfoBarDelegate:
+ base::string16 GetMessageText() const override { return message_; }
+ base::string16 GetButtonLabel(InfoBarButton button) const override {
+ return l10n_util::GetStringUTF16((button == BUTTON_OK)
+ ? IDS_CRYPTOTOKEN_ALLOW_BUTTON
+ : IDS_CRYPTOTOKEN_DENY_BUTTON);
+ }
+
+ bool Accept() override {
+ answered_ = true;
+ callback_.Run(cryptotoken_private::PERMISSION_RESULT_ALLOWED);
+ return true;
+ }
+ bool Cancel() override {
+ answered_ = true;
+ callback_.Run(cryptotoken_private::PERMISSION_RESULT_DENIED);
+ return true;
+ }
+
+ // InfoBarDelegate:
+ Type GetInfoBarType() const override { return PAGE_ACTION_TYPE; }
+ int GetIconID() const override { return IDR_INFOBAR_CRYPTOTOKEN; }
+
+ base::string16 message_;
+ InfoBarCallback callback_;
+ bool answered_;
+};
+
+} // namespace
+
+CryptotokenPrivateRequestPermissionFunction::
+ CryptotokenPrivateRequestPermissionFunction()
+ : chrome_details_(this) {
+}
+
+ExtensionFunction::ResponseAction
+CryptotokenPrivateRequestPermissionFunction::Run() {
+ scoped_ptr<cryptotoken_private::RequestPermission::Params> params =
+ cryptotoken_private::RequestPermission::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(params);
+
+ content::WebContents* web_contents = NULL;
+ if (!extensions::ExtensionTabUtil::GetTabById(
+ params->tab_id, chrome_details_.GetProfile(), true, NULL, NULL,
+ &web_contents, NULL)) {
+ return RespondNow(Error(extensions::ErrorUtils::FormatErrorMessage(
+ extensions::tabs_constants::kTabNotFoundError,
+ base::IntToString(params->tab_id))));
+ }
+ DCHECK(web_contents);
+
+ // Fetch the eTLD+1, for display purposes only
+ const GURL origin_url(params->security_origin);
+ if (!origin_url.is_valid()) {
+ return RespondNow(Error(extensions::ErrorUtils::FormatErrorMessage(
+ "Security origin * is not a valid URL", params->security_origin)));
+ }
+ const std::string etldp1 =
+ net::registry_controlled_domains::GetDomainAndRegistry(
+ origin_url,
+ net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
+ if (etldp1.empty()) {
+ return RespondNow(Error(extensions::ErrorUtils::FormatErrorMessage(
+ "Could not find an eTLD for origin *", params->security_origin)));
+ }
+
+ CryptotokenPermissionInfoBarDelegate::Create(
+ InfoBarService::FromWebContents(web_contents),
+ l10n_util::GetStringFUTF16(IDS_CRYPTOTOKEN_INFOBAR_QUESTION,
+ base::UTF8ToUTF16(etldp1)),
+ base::Bind(
+ &CryptotokenPrivateRequestPermissionFunction::OnInfobarResponse,
+ this));
+
+ return RespondLater();
+}
+
+void CryptotokenPrivateRequestPermissionFunction::OnInfobarResponse(
+ cryptotoken_private::PermissionResult result) {
+ Respond(ArgumentList(
+ cryptotoken_private::RequestPermission::Results::Create(result)));
+}
+
+} // namespace api
+} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698