1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/extensions/api/plugins/plugins_handler.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/sync_helper.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/error_utils.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "extensions/common/manifest_constants.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace extensions {
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace keys = manifest_keys;
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace errors = manifest_errors;
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ExtensionSyncTypeTest : public testing::Test {
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum SyncTestExtensionType {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXTENSION,
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    APP,
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    USER_SCRIPT,
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    THEME
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static scoped_refptr<Extension> MakeSyncTestExtensionWithPluginPermission(
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SyncTestExtensionType type,
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GURL& update_url,
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GURL& launch_url,
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Manifest::Location location,
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::FilePath& extension_path,
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      int creation_flags,
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      int num_plugins,
37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      bool has_plugin_permission,
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const std::string& expected_error) {
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::DictionaryValue source;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    source.SetString(keys::kName, "PossiblySyncableExtension");
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    source.SetString(keys::kVersion, "0.0.0.0");
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (type == APP)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      source.SetString(keys::kApp, "true");
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (type == THEME)
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      source.Set(keys::kTheme, new base::DictionaryValue());
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!update_url.is_empty()) {
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      source.SetString(keys::kUpdateURL, update_url.spec());
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!launch_url.is_empty()) {
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      source.SetString(keys::kLaunchWebURL, launch_url.spec());
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (type != THEME) {
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      source.SetBoolean(keys::kConvertedFromUserScript, type == USER_SCRIPT);
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      if (num_plugins >= 0) {
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        base::ListValue* plugins = new base::ListValue();
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        for (int i = 0; i < num_plugins; ++i) {
57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          base::DictionaryValue* plugin = new base::DictionaryValue();
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          plugin->SetString(keys::kPluginsPath, std::string());
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          plugins->Set(i, plugin);
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        }
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        source.Set(keys::kPlugins, plugins);
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (has_plugin_permission) {
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ListValue* plugins = new base::ListValue();
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      plugins->Set(0, new base::StringValue("plugin"));
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      source.Set(keys::kPermissions, plugins);
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string error;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<Extension> extension = Extension::Create(
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        extension_path, location, source, creation_flags, &error);
73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (expected_error == "")
74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      EXPECT_TRUE(extension.get());
75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    else
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      EXPECT_FALSE(extension.get());
77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(expected_error, error);
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return extension;
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static scoped_refptr<Extension> MakeSyncTestExtension(
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SyncTestExtensionType type,
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const GURL& update_url,
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const GURL& launch_url,
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      Manifest::Location location,
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const base::FilePath& extension_path,
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      int creation_flags) {
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return MakeSyncTestExtensionWithPluginPermission(
89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        type, update_url, launch_url, location, extension_path,
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        creation_flags, -1, false, "");
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const char kValidUpdateUrl1[];
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const char kValidUpdateUrl2[];
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char ExtensionSyncTypeTest::kValidUpdateUrl1[] =
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://clients2.google.com/service/update2/crx";
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char ExtensionSyncTypeTest::kValidUpdateUrl2[] =
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "https://clients2.google.com/service/update2/crx";
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, NormalExtensionNoUpdateUrl) {
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension(
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::INTERNAL, base::FilePath(),
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::NO_FLAGS));
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(sync_helper::IsSyncableExtension(extension.get()));
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ExtensionSyncTypeTest, UserScriptValidUpdateUrl) {
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension(
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(USER_SCRIPT, GURL(kValidUpdateUrl1), GURL(),
113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::INTERNAL, base::FilePath(),
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::NO_FLAGS));
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(sync_helper::IsSyncableExtension(extension.get()));
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, UserScriptNoUpdateUrl) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension(
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(USER_SCRIPT, GURL(), GURL(),
121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::INTERNAL, base::FilePath(),
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::NO_FLAGS));
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(sync_helper::IsSyncableExtension(extension.get()));
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, ThemeNoUpdateUrl) {
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension(
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(THEME, GURL(), GURL(),
129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::INTERNAL, base::FilePath(),
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::NO_FLAGS));
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(sync_helper::IsSyncableExtension(extension.get()));
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(sync_helper::IsSyncableApp(extension.get()));
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ExtensionSyncTypeTest, AppWithLaunchUrl) {
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension(
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(EXTENSION, GURL(), GURL("http://www.google.com"),
138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::INTERNAL, base::FilePath(),
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::NO_FLAGS));
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(sync_helper::IsSyncableApp(extension.get()));
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, ExtensionExternal) {
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension(
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::EXTERNAL_PREF, base::FilePath(),
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::NO_FLAGS));
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(sync_helper::IsSyncableExtension(extension.get()));
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, UserScriptThirdPartyUpdateUrl) {
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension(
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          USER_SCRIPT, GURL("http://third-party.update_url.com"), GURL(),
155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          Manifest::INTERNAL, base::FilePath(), Extension::NO_FLAGS));
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(sync_helper::IsSyncableExtension(extension.get()));
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, OnlyDisplayAppsInLauncher) {
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension(
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
162ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::INTERNAL, base::FilePath(),
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::NO_FLAGS));
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(extension->ShouldDisplayInAppLauncher());
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(extension->ShouldDisplayInNewTabPage());
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> app(
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(APP, GURL(), GURL("http://www.google.com"),
170ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::INTERNAL, base::FilePath(),
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::NO_FLAGS));
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(app->ShouldDisplayInAppLauncher());
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(app->ShouldDisplayInNewTabPage());
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, DisplayInXManifestProperties) {
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.SetString(keys::kName, "TestComponentApp");
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.SetString(keys::kVersion, "0.0.0.0");
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.SetString(keys::kApp, "true");
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.SetString(keys::kPlatformAppBackgroundPage, std::string());
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string error;
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> app;
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Default to true.
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  app = Extension::Create(
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(error, std::string());
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(app->ShouldDisplayInAppLauncher());
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(app->ShouldDisplayInNewTabPage());
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Value display_in_NTP defaults to display_in_launcher.
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.SetBoolean(keys::kDisplayInLauncher, false);
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  app = Extension::Create(
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(error, std::string());
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(app->ShouldDisplayInAppLauncher());
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(app->ShouldDisplayInNewTabPage());
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Value display_in_NTP = true overriding display_in_launcher = false.
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.SetBoolean(keys::kDisplayInNewTabPage, true);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  app = Extension::Create(
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(error, std::string());
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(app->ShouldDisplayInAppLauncher());
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(app->ShouldDisplayInNewTabPage());
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Value display_in_NTP = false only, overrides default = true.
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.Remove(keys::kDisplayInLauncher, NULL);
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.SetBoolean(keys::kDisplayInNewTabPage, false);
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  app = Extension::Create(
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(error, std::string());
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(app->ShouldDisplayInAppLauncher());
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(app->ShouldDisplayInNewTabPage());
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Error checking.
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.SetString(keys::kDisplayInNewTabPage, "invalid");
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  app = Extension::Create(
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(error, std::string(errors::kInvalidDisplayInNewTabPage));
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, OnlySyncInternal) {
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension_internal(
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::INTERNAL, base::FilePath(),
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::NO_FLAGS));
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(sync_helper::IsSyncable(extension_internal.get()));
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension_noninternal(
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
234ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::COMPONENT, base::FilePath(),
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::NO_FLAGS));
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(sync_helper::IsSyncable(extension_noninternal.get()));
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, DontSyncDefault) {
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension_default(
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                            Manifest::INTERNAL, base::FilePath(),
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::WAS_INSTALLED_BY_DEFAULT));
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(sync_helper::IsSyncable(extension_default.get()));
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
247ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// These plugin tests don't make sense on Chrome OS, where extension plugins
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// are not allowed.
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS)
250ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ExtensionSyncTypeTest, ExtensionWithEmptyPlugins) {
251ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<Extension> extension(
252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      MakeSyncTestExtensionWithPluginPermission(
253ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          EXTENSION, GURL(), GURL(),
254ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          Manifest::INTERNAL, base::FilePath(),
255ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          Extension::NO_FLAGS, 0, false, ""));
256ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (extension.get())
257ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_TRUE(sync_helper::IsSyncableExtension(extension.get()));
258ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
259ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, ExtensionWithPlugin) {
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension(
262ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      MakeSyncTestExtensionWithPluginPermission(
263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          EXTENSION, GURL(), GURL(),
264ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          Manifest::INTERNAL, base::FilePath(),
265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          Extension::NO_FLAGS, 1, false, ""));
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (extension.get())
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_FALSE(sync_helper::IsSyncableExtension(extension.get()));
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSyncTypeTest, ExtensionWithTwoPlugins) {
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension(
272ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      MakeSyncTestExtensionWithPluginPermission(
273ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          EXTENSION, GURL(), GURL(),
274ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          Manifest::INTERNAL, base::FilePath(),
275ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          Extension::NO_FLAGS, 2, false, ""));
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (extension.get())
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_FALSE(sync_helper::IsSyncableExtension(extension.get()));
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ExtensionSyncTypeTest, ExtensionWithPluginPermission) {
281ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Specifying the "plugin" permission in the manifest is an error.
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<Extension> extension(
283ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      MakeSyncTestExtensionWithPluginPermission(
284ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          EXTENSION, GURL(), GURL(),
285ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          Manifest::INTERNAL, base::FilePath(),
286ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          Extension::NO_FLAGS, 0, true,
287ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          ErrorUtils::FormatErrorMessage(
288ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch              errors::kPermissionNotAllowedInManifest, "plugin")));
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
290ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // !defined(OS_CHROMEOS)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace extensions
294