| Index: chrome/common/extensions/manifest_unittest.cc | 
| diff --git a/chrome/common/extensions/manifest_unittest.cc b/chrome/common/extensions/manifest_unittest.cc | 
| deleted file mode 100644 | 
| index 61282fac3904b7c1c64b0218d8820a68a42dbd92..0000000000000000000000000000000000000000 | 
| --- a/chrome/common/extensions/manifest_unittest.cc | 
| +++ /dev/null | 
| @@ -1,392 +0,0 @@ | 
| -// 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 "chrome/common/extensions/manifest.h" | 
| - | 
| -#include <algorithm> | 
| -#include <set> | 
| -#include <string> | 
| - | 
| -#include "base/memory/scoped_ptr.h" | 
| -#include "base/utf_string_conversions.h" | 
| -#include "base/values.h" | 
| -#include "chrome/common/extensions/extension_constants.h" | 
| -#include "chrome/common/extensions/extension_error_utils.h" | 
| -#include "testing/gtest/include/gtest/gtest.h" | 
| - | 
| -namespace keys = extension_manifest_keys; | 
| -namespace errors = extension_manifest_errors; | 
| - | 
| -namespace extensions { | 
| - | 
| -namespace { | 
| - | 
| -// Keys that define types. | 
| -const char* kTypeKeys[] = { | 
| -  keys::kApp, | 
| -  keys::kTheme, | 
| -  keys::kPlatformApp | 
| -}; | 
| - | 
| -// Keys that are not accesible by themes. | 
| -const char* kNotThemeKeys[] = { | 
| -  keys::kBrowserAction, | 
| -  keys::kPageAction, | 
| -  keys::kPageActions, | 
| -  keys::kChromeURLOverrides, | 
| -  keys::kPermissions, | 
| -  keys::kOptionalPermissions, | 
| -  keys::kOptionsPage, | 
| -  keys::kBackground, | 
| -  keys::kOfflineEnabled, | 
| -  keys::kMinimumChromeVersion, | 
| -  keys::kRequirements, | 
| -  keys::kConvertedFromUserScript, | 
| -  keys::kNaClModules, | 
| -  keys::kPlugins, | 
| -  keys::kContentScripts, | 
| -  keys::kOmnibox, | 
| -  keys::kDevToolsPage, | 
| -  keys::kSidebar, | 
| -  keys::kHomepageURL, | 
| -  keys::kContentSecurityPolicy, | 
| -  keys::kFileBrowserHandlers, | 
| -  keys::kIncognito, | 
| -  keys::kInputComponents, | 
| -  keys::kTtsEngine, | 
| -  keys::kIntents | 
| -}; | 
| - | 
| -// Keys that are not accessible by hosted apps. | 
| -const char* kNotHostedAppKeys[] = { | 
| -  keys::kBrowserAction, | 
| -  keys::kPageAction, | 
| -  keys::kPageActions, | 
| -  keys::kChromeURLOverrides, | 
| -  keys::kContentScripts, | 
| -  keys::kOmnibox, | 
| -  keys::kDevToolsPage, | 
| -  keys::kSidebar, | 
| -  keys::kHomepageURL, | 
| -  keys::kContentSecurityPolicy, | 
| -  keys::kFileBrowserHandlers, | 
| -  keys::kIncognito, | 
| -  keys::kInputComponents, | 
| -  keys::kTtsEngine, | 
| -  keys::kIntents | 
| -}; | 
| - | 
| -// Keys not accessible by packaged aps. | 
| -const char* kNotPackagedAppKeys[] = { | 
| -  keys::kBrowserAction, | 
| -  keys::kPageAction, | 
| -  keys::kPageActions, | 
| -  keys::kChromeURLOverrides, | 
| -}; | 
| - | 
| -// Keys not accessible by platform apps. | 
| -const char* kNotPlatformAppKeys[] = { | 
| -  keys::kBrowserAction, | 
| -  keys::kPageAction, | 
| -  keys::kPageActions, | 
| -  keys::kChromeURLOverrides, | 
| -  keys::kContentScripts, | 
| -  keys::kOmnibox, | 
| -  keys::kDevToolsPage, | 
| -  keys::kSidebar, | 
| -  keys::kHomepageURL, | 
| -}; | 
| - | 
| -// Returns all the manifest keys not including those in |filtered| or kTypeKeys. | 
| -std::set<std::string> GetAccessibleKeys(const char* filtered[], size_t length) { | 
| -  std::set<std::string> all_keys = Manifest::GetAllKnownKeys(); | 
| -  std::set<std::string> filtered_keys(filtered, filtered + length); | 
| - | 
| -  // Starting with all possible manfiest keys, remove the keys that aren't | 
| -  // accessible for the given type. | 
| -  std::set<std::string> intermediate; | 
| -  std::set_difference(all_keys.begin(), all_keys.end(), | 
| -                      filtered_keys.begin(), filtered_keys.end(), | 
| -                      std::insert_iterator<std::set<std::string> >( | 
| -                          intermediate, intermediate.begin())); | 
| - | 
| -  // Then remove the keys that specify types (app, platform_app, etc.). | 
| -  std::set<std::string> result; | 
| -  std::set<std::string> type_keys( | 
| -      kTypeKeys, kTypeKeys + ARRAYSIZE_UNSAFE(kTypeKeys)); | 
| -  std::set_difference(intermediate.begin(), intermediate.end(), | 
| -                      type_keys.begin(), type_keys.end(), | 
| -                      std::insert_iterator<std::set<std::string> >( | 
| -                          result, result.begin())); | 
| - | 
| -  return result; | 
| -} | 
| - | 
| -}  // namespace | 
| - | 
| -class ManifestTest : public testing::Test { | 
| - public: | 
| -  ManifestTest() : default_value_("test") {} | 
| - | 
| - protected: | 
| -  void AssertType(Manifest* manifest, Manifest::Type type) { | 
| -    EXPECT_EQ(type, manifest->GetType()); | 
| -    EXPECT_EQ(type == Manifest::kTypeTheme, manifest->IsTheme()); | 
| -    EXPECT_EQ(type == Manifest::kTypePlatformApp, manifest->IsPlatformApp()); | 
| -    EXPECT_EQ(type == Manifest::kTypePackagedApp, manifest->IsPackagedApp()); | 
| -    EXPECT_EQ(type == Manifest::kTypeHostedApp, manifest->IsHostedApp()); | 
| -  } | 
| - | 
| -  void TestRestrictedKeys(Manifest* manifest, | 
| -                          const char* restricted_keys[], | 
| -                          size_t restricted_keys_length) { | 
| -    // Verify that the keys on the restricted key list for the given manifest | 
| -    // fail validation and are filtered out. | 
| -    DictionaryValue* value = manifest->value(); | 
| -    for (size_t i = 0; i < restricted_keys_length; ++i) { | 
| -      std::string error, str; | 
| -      value->Set(restricted_keys[i], Value::CreateStringValue(default_value_)); | 
| -      EXPECT_FALSE(manifest->ValidateManifest(&error)); | 
| -      EXPECT_EQ(error, ExtensionErrorUtils::FormatErrorMessage( | 
| -          errors::kFeatureNotAllowed, restricted_keys[i])); | 
| -      EXPECT_FALSE(manifest->GetString(restricted_keys[i], &str)); | 
| -      EXPECT_TRUE(value->Remove(restricted_keys[i], NULL)); | 
| -    } | 
| -  } | 
| - | 
| -  std::string default_value_; | 
| -}; | 
| - | 
| -// Verifies that extensions can access the correct keys. | 
| -TEST_F(ManifestTest, Extension) { | 
| -  // Generate the list of keys accessible by extensions. | 
| -  std::set<std::string> extension_keys = GetAccessibleKeys(NULL, 0u); | 
| - | 
| -  // Construct the underlying value using every single key other than those | 
| -  // on the restricted list.. We can use the same value for every key because we | 
| -  // validate only by checking the presence of the keys. | 
| -  DictionaryValue* value = new DictionaryValue(); | 
| -  for (std::set<std::string>::iterator i = extension_keys.begin(); | 
| -       i != extension_keys.end(); ++i) | 
| -    value->Set(*i, Value::CreateStringValue(default_value_)); | 
| - | 
| -  scoped_ptr<Manifest> manifest(new Manifest(value)); | 
| -  std::string error; | 
| -  EXPECT_TRUE(manifest->ValidateManifest(&error)); | 
| -  EXPECT_EQ("", error); | 
| -  AssertType(manifest.get(), Manifest::kTypeExtension); | 
| - | 
| -  // Verify that all the extension keys are accessible. | 
| -  for (std::set<std::string>::iterator i = extension_keys.begin(); | 
| -       i != extension_keys.end(); ++i) { | 
| -    std::string value; | 
| -    manifest->GetString(*i, &value); | 
| -    EXPECT_EQ(default_value_, value) << *i; | 
| -  } | 
| - | 
| -  // Test DeepCopy and Equals. | 
| -  scoped_ptr<Manifest> manifest2(manifest->DeepCopy()); | 
| -  EXPECT_TRUE(manifest->Equals(manifest2.get())); | 
| -  EXPECT_TRUE(manifest2->Equals(manifest.get())); | 
| -  value->Set("foo", Value::CreateStringValue("blah")); | 
| -  EXPECT_FALSE(manifest->Equals(manifest2.get())); | 
| -} | 
| - | 
| -// Verifies that themes can access the right keys. | 
| -TEST_F(ManifestTest, Theme) { | 
| -  std::set<std::string> theme_keys = | 
| -      GetAccessibleKeys(kNotThemeKeys, ARRAYSIZE_UNSAFE(kNotThemeKeys)); | 
| - | 
| -  DictionaryValue* value = new DictionaryValue(); | 
| -  for (std::set<std::string>::iterator i = theme_keys.begin(); | 
| -       i != theme_keys.end(); ++i) | 
| -    value->Set(*i, Value::CreateStringValue(default_value_)); | 
| - | 
| -  std::string theme_key = keys::kTheme + std::string(".test"); | 
| -  value->Set(theme_key, Value::CreateStringValue(default_value_)); | 
| - | 
| -  scoped_ptr<Manifest> manifest(new Manifest(value)); | 
| -  std::string error; | 
| -  EXPECT_TRUE(manifest->ValidateManifest(&error)); | 
| -  EXPECT_EQ("", error); | 
| -  AssertType(manifest.get(), Manifest::kTypeTheme); | 
| - | 
| -  // Verify that all the theme keys are accessible. | 
| -  std::string str; | 
| -  for (std::set<std::string>::iterator i = theme_keys.begin(); | 
| -       i != theme_keys.end(); ++i) { | 
| -    EXPECT_TRUE(manifest->GetString(*i, &str)); | 
| -    EXPECT_EQ(default_value_, str) << *i; | 
| -  } | 
| -  EXPECT_TRUE(manifest->GetString(theme_key, &str)); | 
| -  EXPECT_EQ(default_value_, str) << theme_key; | 
| - | 
| -  // And that all the other keys fail validation and are filtered out | 
| -  TestRestrictedKeys(manifest.get(), kNotThemeKeys, | 
| -                     ARRAYSIZE_UNSAFE(kNotThemeKeys)); | 
| -}; | 
| - | 
| -// Verifies that platform apps can access the right keys. | 
| -TEST_F(ManifestTest, PlatformApp) { | 
| -  std::set<std::string> platform_keys = GetAccessibleKeys( | 
| -      kNotPlatformAppKeys, | 
| -      ARRAYSIZE_UNSAFE(kNotPlatformAppKeys)); | 
| - | 
| -  DictionaryValue* value = new DictionaryValue(); | 
| -  for (std::set<std::string>::iterator i = platform_keys.begin(); | 
| -       i != platform_keys.end(); ++i) | 
| -    value->Set(*i, Value::CreateStringValue(default_value_)); | 
| - | 
| -  value->Set(keys::kPlatformApp, Value::CreateBooleanValue(true)); | 
| - | 
| -  scoped_ptr<Manifest> manifest(new Manifest(value)); | 
| -  std::string error; | 
| -  EXPECT_TRUE(manifest->ValidateManifest(&error)); | 
| -  EXPECT_EQ("", error); | 
| -  AssertType(manifest.get(), Manifest::kTypePlatformApp); | 
| - | 
| -  // Verify that all the platform app keys are accessible. | 
| -  std::string str; | 
| -  for (std::set<std::string>::iterator i = platform_keys.begin(); | 
| -       i != platform_keys.end(); ++i) { | 
| -    EXPECT_TRUE(manifest->GetString(*i, &str)); | 
| -    EXPECT_EQ(default_value_, str) << *i; | 
| -  } | 
| -  bool is_platform_app = false; | 
| -  EXPECT_TRUE(manifest->GetBoolean(keys::kPlatformApp, &is_platform_app)); | 
| -  EXPECT_TRUE(is_platform_app) << keys::kPlatformApp; | 
| - | 
| -  // And that all the other keys fail validation and are filtered out. | 
| -  TestRestrictedKeys(manifest.get(), kNotPlatformAppKeys, | 
| -                     ARRAYSIZE_UNSAFE(kNotPlatformAppKeys)); | 
| -}; | 
| - | 
| -// Verifies that hosted apps can access the right keys. | 
| -TEST_F(ManifestTest, HostedApp) { | 
| -  std::set<std::string> keys = GetAccessibleKeys( | 
| -      kNotHostedAppKeys, | 
| -      ARRAYSIZE_UNSAFE(kNotHostedAppKeys)); | 
| - | 
| -  DictionaryValue* value = new DictionaryValue(); | 
| -  for (std::set<std::string>::iterator i = keys.begin(); | 
| -       i != keys.end(); ++i) | 
| -    value->Set(*i, Value::CreateStringValue(default_value_)); | 
| - | 
| -  value->Set(keys::kWebURLs, Value::CreateStringValue(default_value_)); | 
| - | 
| -  scoped_ptr<Manifest> manifest(new Manifest(value)); | 
| -  std::string error; | 
| -  EXPECT_TRUE(manifest->ValidateManifest(&error)); | 
| -  EXPECT_EQ("", error); | 
| -  AssertType(manifest.get(), Manifest::kTypeHostedApp); | 
| - | 
| -  // Verify that all the hosted app keys are accessible. | 
| -  std::string str; | 
| -  for (std::set<std::string>::iterator i = keys.begin(); | 
| -       i != keys.end(); ++i) { | 
| -    EXPECT_TRUE(manifest->GetString(*i, &str)); | 
| -    EXPECT_EQ(default_value_, str) << *i; | 
| -  } | 
| -  EXPECT_TRUE(manifest->GetString(keys::kWebURLs, &str)); | 
| -  EXPECT_EQ(default_value_, str) << keys::kWebURLs; | 
| - | 
| -  // And that all the other keys fail validation and are filtered out. | 
| -  TestRestrictedKeys(manifest.get(), kNotHostedAppKeys, | 
| -                     ARRAYSIZE_UNSAFE(kNotHostedAppKeys)); | 
| -}; | 
| - | 
| -// Verifies that packaged apps can access the right keys. | 
| -TEST_F(ManifestTest, PackagedApp) { | 
| -  std::set<std::string> keys = GetAccessibleKeys( | 
| -      kNotPackagedAppKeys, | 
| -      ARRAYSIZE_UNSAFE(kNotPackagedAppKeys)); | 
| - | 
| -  DictionaryValue* value = new DictionaryValue(); | 
| -  for (std::set<std::string>::iterator i = keys.begin(); | 
| -       i != keys.end(); ++i) | 
| -    value->Set(*i, Value::CreateStringValue(default_value_)); | 
| -  value->Set(keys::kApp, Value::CreateStringValue(default_value_)); | 
| - | 
| -  scoped_ptr<Manifest> manifest(new Manifest(value)); | 
| -  std::string error; | 
| -  EXPECT_TRUE(manifest->ValidateManifest(&error)); | 
| -  EXPECT_EQ("", error); | 
| -  AssertType(manifest.get(), Manifest::kTypePackagedApp); | 
| - | 
| -  // Verify that all the packaged app keys are accessible. | 
| -  std::string str; | 
| -  for (std::set<std::string>::iterator i = keys.begin(); | 
| -       i != keys.end(); ++i) { | 
| -    EXPECT_TRUE(manifest->GetString(*i, &str)); | 
| -    EXPECT_EQ(default_value_, str) << *i; | 
| -  } | 
| -  EXPECT_TRUE(manifest->GetString(keys::kApp, &str)); | 
| -  EXPECT_EQ(default_value_, str) << keys::kApp; | 
| - | 
| -  // And that all the other keys fail validation and are filtered out. | 
| -  TestRestrictedKeys(manifest.get(), kNotPackagedAppKeys, | 
| -                     ARRAYSIZE_UNSAFE(kNotPackagedAppKeys)); | 
| -}; | 
| - | 
| -// Verifies that the various getters filter unknown and restricted keys. | 
| -TEST_F(ManifestTest, Getters) { | 
| -  DictionaryValue* value = new DictionaryValue(); | 
| -  scoped_ptr<Manifest> manifest(new Manifest(value)); | 
| -  std::string unknown_key = "asdfaskldjf"; | 
| - | 
| -  // Verify that the key filtering works for each of the getters. | 
| -  // Get and GetBoolean | 
| -  bool expected_bool = true, actual_bool = false; | 
| -  value->Set(unknown_key, Value::CreateBooleanValue(expected_bool)); | 
| -  EXPECT_FALSE(manifest->HasKey(unknown_key)); | 
| -  EXPECT_FALSE(manifest->GetBoolean(unknown_key, &actual_bool)); | 
| -  EXPECT_FALSE(actual_bool); | 
| -  Value* actual_value = NULL; | 
| -  EXPECT_FALSE(manifest->Get(unknown_key, &actual_value)); | 
| -  EXPECT_TRUE(value->Remove(unknown_key, NULL)); | 
| - | 
| -  // GetInteger | 
| -  int expected_int = 5, actual_int = 0; | 
| -  value->Set(unknown_key, Value::CreateIntegerValue(expected_int)); | 
| -  EXPECT_FALSE(manifest->GetInteger(unknown_key, &actual_int)); | 
| -  EXPECT_NE(expected_int, actual_int); | 
| -  EXPECT_TRUE(value->Remove(unknown_key, NULL)); | 
| - | 
| -  // GetString | 
| -  std::string expected_str = "hello", actual_str; | 
| -  value->Set(unknown_key, Value::CreateStringValue(expected_str)); | 
| -  EXPECT_FALSE(manifest->GetString(unknown_key, &actual_str)); | 
| -  EXPECT_NE(expected_str, actual_str); | 
| -  EXPECT_TRUE(value->Remove(unknown_key, NULL)); | 
| - | 
| -  // GetString (string16) | 
| -  string16 expected_str16(UTF8ToUTF16("hello")), actual_str16; | 
| -  value->Set(unknown_key, Value::CreateStringValue(expected_str16)); | 
| -  EXPECT_FALSE(manifest->GetString(unknown_key, &actual_str16)); | 
| -  EXPECT_NE(expected_str16, actual_str16); | 
| -  EXPECT_TRUE(value->Remove(unknown_key, NULL)); | 
| - | 
| -  // GetDictionary | 
| -  DictionaryValue* expected_dict = new DictionaryValue(); | 
| -  DictionaryValue* actual_dict = NULL; | 
| -  expected_dict->Set("foo", Value::CreateStringValue("bar")); | 
| -  value->Set(unknown_key, expected_dict); | 
| -  EXPECT_FALSE(manifest->GetDictionary(unknown_key, &actual_dict)); | 
| -  EXPECT_EQ(NULL, actual_dict); | 
| -  std::string path = unknown_key + ".foo"; | 
| -  EXPECT_FALSE(manifest->GetString(path, &actual_str)); | 
| -  EXPECT_NE("bar", actual_str); | 
| -  EXPECT_TRUE(value->Remove(unknown_key, NULL)); | 
| - | 
| -  // GetList | 
| -  ListValue* expected_list = new ListValue(); | 
| -  ListValue* actual_list = NULL; | 
| -  expected_list->Append(Value::CreateStringValue("blah")); | 
| -  value->Set(unknown_key, expected_list); | 
| -  EXPECT_FALSE(manifest->GetList(unknown_key, &actual_list)); | 
| -  EXPECT_EQ(NULL, actual_list); | 
| -  EXPECT_TRUE(value->Remove(unknown_key, NULL)); | 
| -} | 
| - | 
| -}  // namespace extensions | 
|  |