blob: c226902cb4f997eef6500dee84b244670264dd76 [file] [log] [blame]
// Copyright (c) 2011 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 "base/stringprintf.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chrome/browser/extensions/extension_install_dialog.h"
#include "chrome/browser/extensions/extension_management_api.h"
#include "chrome/browser/extensions/extension_management_api_constants.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_test_message_listener.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/common/chrome_notification_types.h"
namespace keys = extension_management_api_constants;
namespace util = extension_function_test_utils;
class ExtensionManagementApiBrowserTest : public ExtensionBrowserTest {};
// We test this here instead of in an ExtensionApiTest because normal extensions
// are not allowed to call the install function.
IN_PROC_BROWSER_TEST_F(ExtensionManagementApiBrowserTest, InstallEvent) {
ExtensionTestMessageListener listener1("ready", false);
ASSERT_TRUE(LoadExtension(
test_data_dir_.AppendASCII("management/install_event")));
ASSERT_TRUE(listener1.WaitUntilSatisfied());
ExtensionTestMessageListener listener2("got_event", false);
ASSERT_TRUE(LoadExtension(
test_data_dir_.AppendASCII("api_test/management/enabled_extension")));
ASSERT_TRUE(listener2.WaitUntilSatisfied());
}
IN_PROC_BROWSER_TEST_F(ExtensionManagementApiBrowserTest, LaunchApp) {
ExtensionTestMessageListener listener1("app_launched", false);
ExtensionTestMessageListener listener2("got_expected_error", false);
ASSERT_TRUE(LoadExtension(
test_data_dir_.AppendASCII("management/simple_extension")));
ASSERT_TRUE(LoadExtension(
test_data_dir_.AppendASCII("management/packaged_app")));
ASSERT_TRUE(LoadExtension(
test_data_dir_.AppendASCII("management/launch_app")));
ASSERT_TRUE(listener1.WaitUntilSatisfied());
ASSERT_TRUE(listener2.WaitUntilSatisfied());
}
IN_PROC_BROWSER_TEST_F(ExtensionManagementApiBrowserTest,
LaunchAppFromBackground) {
ExtensionTestMessageListener listener1("success", false);
ASSERT_TRUE(LoadExtension(
test_data_dir_.AppendASCII("management/packaged_app")));
ASSERT_TRUE(LoadExtension(
test_data_dir_.AppendASCII("management/launch_app_from_background")));
ASSERT_TRUE(listener1.WaitUntilSatisfied());
}
class ExtensionManagementApiEscalationTest : public ExtensionBrowserTest {
protected:
// The id of the permissions escalation test extension we use.
static const char kId[];
virtual void SetUpOnMainThread() OVERRIDE {
ExtensionService* service = browser()->profile()->GetExtensionService();
// Install low-permission version of the extension.
ASSERT_TRUE(InstallExtension(
test_data_dir_.AppendASCII("permissions-low-v1.crx"), 1));
EXPECT_TRUE(service->GetExtensionById(kId, false) != NULL);
// Update to a high-permission version - it should get disabled.
EXPECT_FALSE(UpdateExtension(
kId, test_data_dir_.AppendASCII("permissions-high-v2.crx"), -1));
EXPECT_TRUE(service->GetExtensionById(kId, false) == NULL);
EXPECT_TRUE(service->GetExtensionById(kId, true) != NULL);
EXPECT_TRUE(
service->extension_prefs()->DidExtensionEscalatePermissions(kId));
}
void ReEnable(bool user_gesture, const std::string& expected_error) {
scoped_refptr<SetEnabledFunction> function(new SetEnabledFunction);
if (user_gesture)
function->set_user_gesture(true);
bool response = util::RunFunction(
function.get(),
base::StringPrintf("[\"%s\", true]", kId),
browser(),
util::NONE);
if (expected_error.empty()) {
EXPECT_EQ(true, response);
} else {
EXPECT_TRUE(response == false);
EXPECT_EQ(expected_error, function->GetError());
}
}
};
const char ExtensionManagementApiEscalationTest::kId[] =
"pgdpcfcocojkjfbgpiianjngphoopgmo";
IN_PROC_BROWSER_TEST_F(ExtensionManagementApiEscalationTest,
DisabledReason) {
scoped_ptr<base::Value> result(
util::RunFunctionAndReturnResult(new GetExtensionByIdFunction(),
base::StringPrintf("[\"%s\"]", kId),
browser()));
ASSERT_TRUE(result.get() != NULL);
ASSERT_TRUE(result->IsType(base::Value::TYPE_DICTIONARY));
base::DictionaryValue* dict =
static_cast<base::DictionaryValue*>(result.get());
std::string reason;
EXPECT_TRUE(dict->GetStringASCII(keys::kDisabledReasonKey, &reason));
EXPECT_EQ(reason, std::string(keys::kDisabledReasonPermissionsIncrease));
}
IN_PROC_BROWSER_TEST_F(ExtensionManagementApiEscalationTest,
ReEnable) {
// Expect an error about no gesture.
ReEnable(false, keys::kGestureNeededForEscalationError);
// Expect an error that user cancelled the dialog.
SetExtensionInstallDialogAutoConfirmForTests(false);
ReEnable(true, keys::kUserDidNotReEnableError);
// This should succeed when user accepts dialog.
SetExtensionInstallDialogAutoConfirmForTests(true);
ReEnable(true, "");
}