blob: 53118610ca68f16022546a80a54a7395db6b0f14 [file] [log] [blame]
// Copyright (c) 2012 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/command_line.h"
#include "base/memory/scoped_ptr.h"
#include "base/test/values_test_util.h"
#include "base/values.h"
#include "chrome/common/extensions/features/feature_channel.h"
#include "chrome/common/extensions/manifest_tests/extension_manifest_test.h"
#include "content/public/common/content_switches.h"
#include "extensions/common/constants.h"
#include "extensions/common/error_utils.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/background_info.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace extensions {
class ExtensionManifestServiceWorkerTest : public ExtensionManifestTest {
public:
ExtensionManifestServiceWorkerTest()
: trunk_channel_(chrome::VersionInfo::CHANNEL_UNKNOWN) {}
void AddServiceWorkerCommandLineSwitch() {
CHECK(!CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableExperimentalWebPlatformFeatures));
CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kEnableExperimentalWebPlatformFeatures);
}
// "app.service_worker" is restricted to trunk in _manifest_features.json.
extensions::ScopedCurrentChannel trunk_channel_;
};
// Checks that a service_worker key is ignored without
// enable-experimental-web-platform-features switch. When service workers are
// enabled by default please remove this test.
TEST_F(ExtensionManifestServiceWorkerTest, ServiceWorkerCommandLineRequired) {
CHECK(!CommandLine::ForCurrentProcess()->HasSwitch(
::switches::kEnableExperimentalWebPlatformFeatures));
LoadFromStringAndExpectError(
"{"
" 'name': '',"
" 'manifest_version': 2,"
" 'version': '1',"
" 'app': {"
" 'service_worker': {"
" 'script': 'service_worker.js'"
" }"
" }"
"}",
manifest_errors::kServiceWorkerRequiresFlag);
}
// Checks that an app manifest with a service_worker key but no script fails.
TEST_F(ExtensionManifestServiceWorkerTest, ServiceWorkerEmpty) {
AddServiceWorkerCommandLineSwitch();
LoadFromStringAndExpectError(
"{"
" 'name': '',"
" 'manifest_version': 2,"
" 'version': '1',"
" 'app': {"
" 'service_worker': {}" // No script specified.
" }"
"}",
manifest_errors::kBackgroundRequiredForPlatformApps);
LoadFromStringAndExpectError(
"{"
" 'name': '',"
" 'manifest_version': 2,"
" 'version': '1',"
" 'app': {"
" 'service_worker': {"
" 'script': ''" // Empty script.
" }"
" }"
"}",
manifest_errors::kBackgroundRequiredForPlatformApps);
}
// Checks that an app manifest with a single script is loaded.
TEST_F(ExtensionManifestServiceWorkerTest, ServiceWorkerScript) {
AddServiceWorkerCommandLineSwitch();
scoped_refptr<Extension> extension(LoadFromStringAndExpectSuccess(
"{"
" 'name': '',"
" 'manifest_version': 2,"
" 'version': '1',"
" 'app': {"
" 'service_worker': {"
" 'script': 'service_worker.js'"
" }"
" }"
"}"));
ASSERT_TRUE(extension.get());
// "app.service_worker" key exists and access is permitted.
EXPECT_TRUE(extension->manifest()->HasPath("app.service_worker"));
EXPECT_EQ("service_worker.js",
BackgroundInfo::GetServiceWorkerScript(extension.get()));
EXPECT_TRUE(BackgroundInfo::HasServiceWorker(extension.get()));
}
// Checks that an app manifest with service worker and background script fails.
TEST_F(ExtensionManifestServiceWorkerTest, ServiceWorkerWithBackgroundScript) {
AddServiceWorkerCommandLineSwitch();
LoadFromStringAndExpectError(
"{"
" 'name': '',"
" 'manifest_version': 2,"
" 'version': '1',"
" 'app': {"
" 'service_worker': {"
" 'script': 'service_worker.js'"
" },"
" 'background': {"
" 'scripts': [ 'background.js' ]"
" }"
" }"
"}",
manifest_errors::kInvalidBackgroundCombination);
}
} // namespace extensions