15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/strings/stringprintf.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_util.h"
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/extensions/shared_user_script_master.h"
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/prefs/chrome_pref_service_factory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/common/content_switches.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h"
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension.h"
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::FeatureSwitch;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains high-level startup tests for the extensions system. We've
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// had many silly bugs where command line flags did not get propagated correctly
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// into the services, so we didn't start correctly.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionStartupTestBase : public InProcessBrowserTest {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionStartupTestBase() : unauthenticated_load_allowed_(true) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_expected_extensions_ = 3;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InProcessBrowserTest
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (load_extensions_.empty()) {
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // If no |load_extensions_| were specified, allow unauthenticated
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // extension settings to be loaded from Preferences as if they had been
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // authenticated correctly before they were handed to the ExtensionSystem.
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      command_line->AppendSwitchASCII(
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          switches::kForceFieldTrials,
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          base::StringPrintf(
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              "%s/%s/",
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              chrome_prefs::internals::kSettingsEnforcementTrialName,
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              chrome_prefs::internals::kSettingsEnforcementGroupNoEnforcement));
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OFFICIAL_BUILD) && defined(OS_WIN)
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      // In Windows official builds, it is not possible to disable settings
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // authentication.
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      unauthenticated_load_allowed_ = false;
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    } else {
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::FilePath::StringType paths = JoinString(load_extensions_, ',');
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line->AppendSwitchNative(switches::kLoadExtension,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       paths);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line->AppendSwitch(switches::kDisableExtensionsFileAccessCheck);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool SetUpUserDataDirectory() OVERRIDE {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath profile_dir;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_USER_DATA, &profile_dir);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_dir = profile_dir.AppendASCII(TestingProfile::kTestUserProfileDir);
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::CreateDirectory(profile_dir);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    preferences_file_ = profile_dir.Append(chrome::kPreferencesFilename);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_scripts_dir_ = profile_dir.AppendASCII("User Scripts");
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_dir_ = profile_dir.AppendASCII("Extensions");
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (load_extensions_.empty()) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath src_dir;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PathService::Get(chrome::DIR_TEST_DATA, &src_dir);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      src_dir = src_dir.AppendASCII("extensions").AppendASCII("good");
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CopyFile(src_dir.Append(chrome::kPreferencesFilename),
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     preferences_file_);
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::CopyDirectory(src_dir.AppendASCII("Extensions"),
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          profile_dir, true);  // recursive
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_TRUE(base::DeleteFile(preferences_file_, false));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(phajdan.jr): Check return values of the functions below, carefully.
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::DeleteFile(user_scripts_dir_, true);
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::DeleteFile(extensions_dir_, true);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::TearDown();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForServicesToStart(int num_expected_extensions,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool expect_extensions_enabled) {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionService* service = extensions::ExtensionSystem::Get(
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->extension_service();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Count the number of non-component extensions.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int found_extensions = 0;
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (extensions::ExtensionSet::const_iterator it =
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             service->extensions()->begin();
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         it != service->extensions()->end(); ++it) {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if ((*it)->location() != extensions::Manifest::COMPONENT)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        found_extensions++;
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (!unauthenticated_load_allowed_)
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      num_expected_extensions = 0;
126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(static_cast<uint32>(num_expected_extensions),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              static_cast<uint32>(found_extensions));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(expect_extensions_enabled, service->extensions_enabled());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver user_scripts_observer(
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_USER_SCRIPTS_UPDATED,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    extensions::SharedUserScriptMaster* master =
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::ExtensionSystem::Get(browser()->profile())->
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            shared_user_script_master();
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (!master->scripts_ready())
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_scripts_observer.Wait();
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ASSERT_TRUE(master->scripts_ready());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestInjection(bool expect_css, bool expect_script) {
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (!unauthenticated_load_allowed_) {
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      expect_css = false;
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      expect_script = false;
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Load a page affected by the content script and test to see the effect.
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath test_file;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_TEST_DATA, &test_file);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_file = test_file.AppendASCII("extensions")
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         .AppendASCII("test_file.html");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), net::FilePathToFileURL(test_file));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool result = false;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents(),
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send("
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "    document.defaultView.getComputedStyle(document.body, null)."
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "    getPropertyValue('background-color') == 'rgb(245, 245, 220)')",
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &result));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expect_css, result);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = false;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents(),
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "window.domAutomationController.send(document.title == 'Modified')",
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &result));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expect_script, result);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath preferences_file_;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath extensions_dir_;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath user_scripts_dir_;
176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // True unless unauthenticated extension settings are not allowed to be
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // loaded in this configuration.
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool unauthenticated_load_allowed_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extensions to load from the command line.
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::FilePath::StringType> load_extensions_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_expected_extensions_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExtensionsStartupTest
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we can startup the browser with --enable-extensions and some
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions installed and see them run and do basic things.
189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochtypedef ExtensionStartupTestBase ExtensionsStartupTest;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionsStartupTest, Test) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForServicesToStart(num_expected_extensions_, true);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInjection(true, true);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sometimes times out on Mac.  http://crbug.com/48151
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_NoFileAccess DISABLED_NoFileAccess
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_NoFileAccess NoFileAccess
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that disallowing file access on an extension prevents it from injecting
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// script into a page with a file URL.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionsStartupTest, MAYBE_NoFileAccess) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForServicesToStart(num_expected_extensions_, true);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep a separate list of extensions for which to disable file access, since
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doing so reloads them.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const extensions::Extension*> extension_list;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::ExtensionRegistry* registry =
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extensions::ExtensionRegistry::Get(browser()->profile());
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (extensions::ExtensionSet::const_iterator it =
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           registry->enabled_extensions().begin();
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != registry->enabled_extensions().end(); ++it) {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if ((*it)->location() == extensions::Manifest::COMPONENT)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (extensions::util::AllowFileAccess((*it)->id(), browser()->profile()))
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      extension_list.push_back(it->get());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < extension_list.size(); ++i) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver user_scripts_observer(
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_USER_SCRIPTS_UPDATED,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    extensions::util::SetAllowFileAccess(
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        extension_list[i]->id(), browser()->profile(), false);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_scripts_observer.Wait();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInjection(false, false);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExtensionsLoadTest
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we can startup the browser with --load-extension and see them
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionsLoadTest : public ExtensionStartupTestBase {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionsLoadTest() {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath one_extension_path;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_TEST_DATA, &one_extension_path);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    one_extension_path = one_extension_path
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("extensions")
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("good")
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("Extensions")
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("1.0.0.0");
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    load_extensions_.push_back(one_extension_path.value());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails inconsistently on Linux x64. http://crbug.com/80961
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(dpapad): Has not failed since October 2011, let's reenable, monitor
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and act accordingly.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionsLoadTest, Test) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForServicesToStart(1, true);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInjection(true, true);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExtensionsLoadMultipleTest
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we can startup the browser with multiple extensions
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// via --load-extension=X1,X2,X3.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionsLoadMultipleTest : public ExtensionStartupTestBase {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionsLoadMultipleTest() {
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath one_extension_path;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_TEST_DATA, &one_extension_path);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    one_extension_path = one_extension_path
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("extensions")
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("good")
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("Extensions")
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("1.0.0.0");
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    load_extensions_.push_back(one_extension_path.value());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath second_extension_path;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_TEST_DATA, &second_extension_path);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_extension_path = second_extension_path
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("extensions")
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("app");
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    load_extensions_.push_back(second_extension_path.value());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath third_extension_path;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_TEST_DATA, &third_extension_path);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    third_extension_path = third_extension_path
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("extensions")
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("app1");
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    load_extensions_.push_back(third_extension_path.value());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath fourth_extension_path;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_TEST_DATA, &fourth_extension_path);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fourth_extension_path = fourth_extension_path
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("extensions")
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .AppendASCII("app2");
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    load_extensions_.push_back(fourth_extension_path.value());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionsLoadMultipleTest, Test) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForServicesToStart(4, true);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInjection(true, true);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
303