// Copyright 2014 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 "extensions/browser/runtime_data.h" #include #include "base/macros.h" #include "base/memory/ref_counted.h" #include "extensions/browser/extension_registry.h" #include "extensions/common/extension.h" #include "extensions/common/extension_builder.h" #include "extensions/common/test_util.h" #include "extensions/common/value_builder.h" #include "testing/gtest/include/gtest/gtest.h" namespace extensions { namespace { // Creates a very simple extension with a background page. scoped_refptr CreateExtensionWithBackgroundPage() { return ExtensionBuilder() .SetManifest(DictionaryBuilder() .Set("name", "test") .Set("version", "0.1") .Set("background", DictionaryBuilder().Set("page", "bg.html").Build()) .Build()) .SetID("id2") .Build(); } class RuntimeDataTest : public testing::Test { public: RuntimeDataTest() : registry_(NULL), runtime_data_(®istry_) {} ~RuntimeDataTest() override {} protected: ExtensionRegistry registry_; RuntimeData runtime_data_; private: DISALLOW_COPY_AND_ASSIGN(RuntimeDataTest); }; TEST_F(RuntimeDataTest, IsBackgroundPageReady) { // An extension without a background page is always considered ready. scoped_refptr no_background = test_util::CreateEmptyExtension(); EXPECT_TRUE(runtime_data_.IsBackgroundPageReady(no_background.get())); // An extension with a background page is not ready until the flag is set. scoped_refptr with_background = CreateExtensionWithBackgroundPage(); EXPECT_FALSE(runtime_data_.IsBackgroundPageReady(with_background.get())); // The flag can be toggled. runtime_data_.SetBackgroundPageReady(with_background->id(), true); EXPECT_TRUE(runtime_data_.IsBackgroundPageReady(with_background.get())); runtime_data_.SetBackgroundPageReady(with_background->id(), false); EXPECT_FALSE(runtime_data_.IsBackgroundPageReady(with_background.get())); } TEST_F(RuntimeDataTest, IsBeingUpgraded) { scoped_refptr extension = test_util::CreateEmptyExtension(); // An extension is not being upgraded until the flag is set. EXPECT_FALSE(runtime_data_.IsBeingUpgraded(extension->id())); // The flag can be toggled. runtime_data_.SetBeingUpgraded(extension->id(), true); EXPECT_TRUE(runtime_data_.IsBeingUpgraded(extension->id())); runtime_data_.SetBeingUpgraded(extension->id(), false); EXPECT_FALSE(runtime_data_.IsBeingUpgraded(extension->id())); } TEST_F(RuntimeDataTest, HasUsedWebRequest) { scoped_refptr extension = test_util::CreateEmptyExtension(); // An extension has not used web request until the flag is set. EXPECT_FALSE(runtime_data_.HasUsedWebRequest(extension->id())); // The flag can be toggled. runtime_data_.SetHasUsedWebRequest(extension->id(), true); EXPECT_TRUE(runtime_data_.HasUsedWebRequest(extension->id())); runtime_data_.SetHasUsedWebRequest(extension->id(), false); EXPECT_FALSE(runtime_data_.HasUsedWebRequest(extension->id())); } // Unloading an extension erases any data that shouldn't explicitly be kept // across loads. TEST_F(RuntimeDataTest, OnExtensionUnloaded) { scoped_refptr extension = CreateExtensionWithBackgroundPage(); runtime_data_.SetBackgroundPageReady(extension->id(), true); ASSERT_TRUE(runtime_data_.HasExtensionForTesting(extension->id())); runtime_data_.SetBeingUpgraded(extension->id(), true); runtime_data_.OnExtensionUnloaded( NULL, extension.get(), UnloadedExtensionInfo::REASON_DISABLE); EXPECT_TRUE(runtime_data_.HasExtensionForTesting(extension->id())); EXPECT_FALSE(runtime_data_.IsBackgroundPageReady(extension.get())); EXPECT_TRUE(runtime_data_.IsBeingUpgraded(extension->id())); } } // namespace } // namespace extensions