Home | History | Annotate | Download | only in manifest_handlers
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/common/extensions/manifest_handlers/ui_overrides_handler.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/json/json_string_value_serializer.h"
      9 #include "base/strings/utf_string_conversions.h"
     10 #include "chrome/common/extensions/features/feature_channel.h"
     11 #include "chrome/common/extensions/manifest_url_handler.h"
     12 #include "extensions/common/error_utils.h"
     13 #include "extensions/common/extension.h"
     14 #include "extensions/common/manifest_constants.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 
     17 namespace {
     18 
     19 const char kManifest[] = "{"
     20     " \"version\" : \"1.0.0.0\","
     21     " \"name\" : \"Test\","
     22     " \"chrome_ui_overrides\" : {"
     23     "   \"bookmarks_ui\" : {"
     24     "        \"remove_button\" : true,"
     25     "        \"remove_bookmark_shortcut\" : true"
     26     "    }"
     27     "  }"
     28     "}";
     29 
     30 const char kBrokenManifest[] = "{"
     31     " \"version\" : \"1.0.0.0\","
     32     " \"name\" : \"Test\","
     33     " \"chrome_ui_overrides\" : {"
     34     "  }"
     35     "}";
     36 
     37 using extensions::api::manifest_types::ChromeUIOverrides;
     38 using extensions::Extension;
     39 using extensions::Manifest;
     40 using extensions::UIOverrides;
     41 namespace manifest_keys = extensions::manifest_keys;
     42 
     43 class UIOverrideTest : public testing::Test {
     44 };
     45 
     46 
     47 TEST_F(UIOverrideTest, ParseManifest) {
     48   extensions::ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV);
     49   // This functionality requires a feature flag.
     50   CommandLine::ForCurrentProcess()->AppendSwitchASCII(
     51       "--enable-override-bookmarks-ui",
     52       "1");
     53   std::string manifest(kManifest);
     54   JSONStringValueSerializer json(&manifest);
     55   std::string error;
     56   scoped_ptr<base::Value> root(json.Deserialize(NULL, &error));
     57   ASSERT_TRUE(root);
     58   ASSERT_TRUE(root->IsType(base::Value::TYPE_DICTIONARY));
     59   scoped_refptr<Extension> extension = Extension::Create(
     60       base::FilePath(FILE_PATH_LITERAL("//nonexistent")),
     61       Manifest::INVALID_LOCATION,
     62       *static_cast<base::DictionaryValue*>(root.get()),
     63       Extension::NO_FLAGS,
     64       &error);
     65   ASSERT_TRUE(extension) << error;
     66   ASSERT_TRUE(extension->manifest()->HasPath(manifest_keys::kUIOverride));
     67 
     68   UIOverrides* ui_override = static_cast<UIOverrides*>(
     69       extension->GetManifestData(manifest_keys::kUIOverride));
     70   ASSERT_TRUE(ui_override);
     71   ASSERT_TRUE(ui_override->bookmarks_ui);
     72   EXPECT_TRUE(ui_override->bookmarks_ui->remove_button);
     73   EXPECT_TRUE(ui_override->bookmarks_ui->remove_bookmark_shortcut);
     74 }
     75 
     76 TEST_F(UIOverrideTest, ParseBrokenManifest) {
     77   extensions::ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV);
     78   // This functionality requires a feature flag.
     79   CommandLine::ForCurrentProcess()->AppendSwitchASCII(
     80       "--enable-override-bookmarks-ui",
     81       "1");
     82   std::string manifest(kBrokenManifest);
     83   JSONStringValueSerializer json(&manifest);
     84   std::string error;
     85   scoped_ptr<base::Value> root(json.Deserialize(NULL, &error));
     86   ASSERT_TRUE(root);
     87   ASSERT_TRUE(root->IsType(base::Value::TYPE_DICTIONARY));
     88   scoped_refptr<Extension> extension = Extension::Create(
     89       base::FilePath(FILE_PATH_LITERAL("//nonexistent")),
     90       Manifest::INVALID_LOCATION,
     91       *static_cast<base::DictionaryValue*>(root.get()),
     92       Extension::NO_FLAGS,
     93       &error);
     94   EXPECT_FALSE(extension);
     95   EXPECT_EQ(
     96       extensions::ErrorUtils::FormatErrorMessage(
     97           extensions::manifest_errors::kInvalidEmptyDictionary,
     98           extensions::manifest_keys::kUIOverride),
     99       error);
    100 }
    101 
    102 }  // namespace
    103