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

Unified Diff: chrome/browser/chromeos/extensions/public_session_permission_helper_unittest.cc

Issue 2552203007: Public Sessions - prompt the user for pageCapture requests (Closed)
Patch Set: Nitfix Created 3 years, 10 months 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/chromeos/extensions/public_session_permission_helper_unittest.cc
diff --git a/chrome/browser/chromeos/extensions/public_session_permission_helper_unittest.cc b/chrome/browser/chromeos/extensions/public_session_permission_helper_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..ba370dbd48e76aa0ef7b975fa520deac03f7c23d
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/public_session_permission_helper_unittest.cc
@@ -0,0 +1,255 @@
+// Copyright 2017 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/chromeos/extensions/public_session_permission_helper.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "base/memory/weak_ptr.h"
+#include "base/run_loop.h"
+#include "chrome/browser/extensions/extension_install_prompt.h"
+#include "chrome/common/extensions/extension_test_util.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "content/public/browser/web_contents.h"
+#include "extensions/browser/extension_dialog_auto_confirm.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/manifest.h"
+#include "extensions/common/permissions/api_permission.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using extension_test_util::LoadManifestUnchecked;
+using content::WebContents;
+using extensions::APIPermission;
+using extensions::Extension;
+using extensions::Manifest;
+using Result = ExtensionInstallPrompt::Result;
+
+namespace {
+
+auto permission_a = APIPermission::kAudio;
+auto permission_b = APIPermission::kBookmark;
+bool did_show_dialog;
+
+scoped_refptr<Extension> LoadManifestHelper(const std::string& id) {
+ std::string error;
+ scoped_refptr<Extension> extension = LoadManifestUnchecked(
+ "common/background_page", "manifest.json", Manifest::INVALID_LOCATION,
+ Extension::NO_FLAGS, id, &error);
+ EXPECT_TRUE(extension.get()) << error;
+ return extension;
+}
+
+bool get_did_show_dialog_and_reset() {
+ bool tmp = did_show_dialog;
+ did_show_dialog = false;
+ return tmp;
+}
+
+class ProgrammableInstallPrompt
+ : public ExtensionInstallPrompt,
+ public base::SupportsWeakPtr<ProgrammableInstallPrompt> {
+ public:
+ explicit ProgrammableInstallPrompt(WebContents* contents)
+ : ExtensionInstallPrompt(contents) {}
+
+ ~ProgrammableInstallPrompt() override {}
+
+ void ShowDialog(
+ const DoneCallback& done_callback,
+ const extensions::Extension* extension,
+ const SkBitmap* icon,
+ std::unique_ptr<Prompt> prompt,
+ std::unique_ptr<const extensions::PermissionSet> custom_permissions,
+ const ShowDialogCallback& show_dialog_callback) override {
+ done_callback_ = done_callback;
+ did_show_dialog = true;
+ }
+
+ void Resolve(ExtensionInstallPrompt::Result result) {
+ done_callback_.Run(result);
+ }
+
+ private:
+ ExtensionInstallPrompt::DoneCallback done_callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(ProgrammableInstallPrompt);
+};
+
+} // namespace
+
+namespace extensions {
+namespace permission_helper {
+
+class PublicSessionPermissionHelperTest
+ : public ChromeRenderViewHostTestHarness {
+ public:
+ PublicSessionPermissionHelperTest() {}
+ ~PublicSessionPermissionHelperTest() override {}
+
+ // testing::Test
+ void SetUp() override;
+ void TearDown() override;
+
+ // Class helpers.
+ void RequestResolved(const PermissionIDSet& allowed_permissions);
+ std::unique_ptr<ExtensionInstallPrompt> ReturnPrompt(
+ std::unique_ptr<ExtensionInstallPrompt> prompt,
+ WebContents* web_contents);
+ base::WeakPtr<ProgrammableInstallPrompt> CallHandlePermissionRequest(
+ const scoped_refptr<Extension>& extension,
+ const PermissionIDSet& permissions);
+
+ protected:
+ scoped_refptr<Extension> extension_a_;
+ scoped_refptr<Extension> extension_b_;
+
+ std::vector<PermissionIDSet> allowed_permissions_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(PublicSessionPermissionHelperTest);
+};
+
+void PublicSessionPermissionHelperTest::SetUp() {
+ ChromeRenderViewHostTestHarness::SetUp();
+ extension_a_ = LoadManifestHelper("extension_a");
+ extension_b_ = LoadManifestHelper("extension_b");
+}
+
+void PublicSessionPermissionHelperTest::TearDown() {
+ ResetPermissionsForTesting();
+ ChromeRenderViewHostTestHarness::TearDown();
+}
+
+void PublicSessionPermissionHelperTest::RequestResolved(
+ const PermissionIDSet& allowed_permissions) {
+ allowed_permissions_.push_back(allowed_permissions);
+}
+
+std::unique_ptr<ExtensionInstallPrompt>
+PublicSessionPermissionHelperTest::ReturnPrompt(
+ std::unique_ptr<ExtensionInstallPrompt> prompt,
+ WebContents* web_contents) {
+ return prompt;
+}
+
+base::WeakPtr<ProgrammableInstallPrompt>
+PublicSessionPermissionHelperTest::CallHandlePermissionRequest(
+ const scoped_refptr<Extension>& extension,
+ const PermissionIDSet& permissions) {
+ auto prompt = new ProgrammableInstallPrompt(web_contents());
+ auto prompt_weak_ptr = prompt->AsWeakPtr();
+ auto factory_callback = base::Bind(
+ &PublicSessionPermissionHelperTest::ReturnPrompt, base::Unretained(this),
+ base::Passed(base::WrapUnique<ExtensionInstallPrompt>(prompt)));
+ HandlePermissionRequest(
+ *extension.get(), permissions, web_contents(),
+ base::Bind(&PublicSessionPermissionHelperTest::RequestResolved,
+ base::Unretained(this)),
+ factory_callback);
+ // In case all permissions were already prompted, ReturnPrompt isn't called
+ // because of an early return in HandlePermissionRequest, and in that case the
+ // prompt is free'd as soon as HandlePermissionRequest returns (because it's
+ // owned by a unique_ptr). Using a weak ptr we can detect when this happens.
+ return prompt_weak_ptr;
+}
+
+TEST_F(PublicSessionPermissionHelperTest, TestPermissionAllowed) {
+ // Allow permission_a for extension_a.
+ auto prompt = CallHandlePermissionRequest(extension_a_, {permission_a});
+ EXPECT_TRUE(prompt);
+ EXPECT_TRUE(get_did_show_dialog_and_reset());
+ prompt->Resolve(Result::ACCEPTED);
+ EXPECT_TRUE(allowed_permissions_.at(0).Equals({permission_a}));
+
+ // permission_a was already allowed for extension_a hence no prompt is being
+ // shown, and the ProgrammableInstallPrompt that is passed in is already
+ // free'd after CallHandlePermissionRequest returns so the returned weak
+ // pointer should evaluate to false.
+ EXPECT_FALSE(CallHandlePermissionRequest(extension_a_, {permission_a}));
+ EXPECT_FALSE(get_did_show_dialog_and_reset());
+ EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_a}));
+
+ // permission_a was allowed only for extension_a.
+ prompt = CallHandlePermissionRequest(extension_b_, {permission_a});
+ EXPECT_TRUE(prompt);
+ EXPECT_TRUE(get_did_show_dialog_and_reset());
+ prompt->Resolve(Result::USER_CANCELED);
+ EXPECT_TRUE(allowed_permissions_.at(2).Equals({}));
+}
+
+TEST_F(PublicSessionPermissionHelperTest, TestPermissionDenied) {
+ // Deny permission_a for extension_a.
+ auto prompt = CallHandlePermissionRequest(extension_a_, {permission_a});
+ EXPECT_TRUE(prompt);
+ EXPECT_TRUE(get_did_show_dialog_and_reset());
+ prompt->Resolve(Result::USER_CANCELED);
+ EXPECT_TRUE(allowed_permissions_.at(0).Equals({}));
+
+ // Still denied (previous choice is remembered).
+ EXPECT_FALSE(CallHandlePermissionRequest(extension_a_, {permission_a}));
+ EXPECT_FALSE(get_did_show_dialog_and_reset());
+ EXPECT_TRUE(allowed_permissions_.at(1).Equals({}));
+
+ // permission_a was denied only for extension_a.
+ prompt = CallHandlePermissionRequest(extension_b_, {permission_a});
+ EXPECT_TRUE(prompt);
+ EXPECT_TRUE(get_did_show_dialog_and_reset());
+ prompt->Resolve(Result::ACCEPTED);
+ EXPECT_TRUE(allowed_permissions_.at(2).Equals({permission_a}));
+}
+
+TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsA) {
+ // Open two permission prompts.
+ auto prompt1 =
+ CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
+ EXPECT_TRUE(prompt1);
+ EXPECT_TRUE(get_did_show_dialog_and_reset());
+ EXPECT_FALSE(CallHandlePermissionRequest(extension_a_, {permission_b}));
+ EXPECT_FALSE(get_did_show_dialog_and_reset());
+ // prompt1 resolves both permission requests (second permission request
+ // doesn't show a prompt as permission_b is already prompted by first
+ // permission request).
+ prompt1->Resolve(Result::ACCEPTED);
+ EXPECT_TRUE(allowed_permissions_.at(0).Equals({permission_a, permission_b}));
+ EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_b}));
+}
+
+TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsB) {
+ auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
+ EXPECT_TRUE(prompt1);
+ EXPECT_TRUE(get_did_show_dialog_and_reset());
+ auto prompt2 =
+ CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
+ EXPECT_TRUE(prompt2);
+ EXPECT_TRUE(get_did_show_dialog_and_reset());
+ // prompt2 resolves only permission_b because prompt1 already prompted for
+ // permission_a.
+ prompt2->Resolve(Result::ACCEPTED);
+ EXPECT_EQ(allowed_permissions_.size(), 0u);
+ prompt1->Resolve(Result::ACCEPTED);
+ EXPECT_TRUE(allowed_permissions_.at(0).Equals({permission_a}));
+ EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_a, permission_b}));
+}
+
+TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsDeny) {
+ auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
+ EXPECT_TRUE(prompt1);
+ EXPECT_TRUE(get_did_show_dialog_and_reset());
+ auto prompt2 =
+ CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
+ EXPECT_TRUE(prompt2);
+ EXPECT_TRUE(get_did_show_dialog_and_reset());
+ prompt1->Resolve(Result::USER_CANCELED);
+ EXPECT_TRUE(allowed_permissions_.at(0).Equals({}));
+ prompt2->Resolve(Result::ACCEPTED);
+ EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_b}));
+}
+
+} // namespace permission_helper
+} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698