Home | History | Annotate | Download | only in extensions
      1 // Copyright (c) 2011 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 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
      6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
      7 #pragma once
      8 
      9 #include <string>
     10 
     11 #include "base/command_line.h"
     12 #include "base/file_path.h"
     13 #include "base/memory/scoped_temp_dir.h"
     14 #include "chrome/test/in_process_browser_test.h"
     15 #include "content/common/notification_details.h"
     16 #include "content/common/notification_observer.h"
     17 #include "content/common/notification_type.h"
     18 
     19 class Extension;
     20 
     21 // Base class for extension browser tests. Provides utilities for loading,
     22 // unloading, and installing extensions.
     23 class ExtensionBrowserTest
     24     : public InProcessBrowserTest, public NotificationObserver {
     25  protected:
     26   ExtensionBrowserTest();
     27 
     28   virtual void SetUpCommandLine(CommandLine* command_line);
     29   const Extension* LoadExtension(const FilePath& path);
     30 
     31   // Same as above, but enables the extension in incognito mode first.
     32   const Extension* LoadExtensionIncognito(const FilePath& path);
     33 
     34   // By default, unpacked extensions have file access: this loads them with
     35   // that permission removed.
     36   const Extension* LoadExtensionNoFileAccess(const FilePath& path);
     37 
     38   // Same as above, but enables the extension in incognito mode first.
     39   const Extension* LoadExtensionIncognitoNoFileAccess(const FilePath& path);
     40 
     41   // Loads extension and imitates that it is a component extension.
     42   bool LoadExtensionAsComponent(const FilePath& path);
     43 
     44   // Pack the extension in |dir_path| into a crx file and return its path.
     45   // Return an empty FilePath if there were errors.
     46   FilePath PackExtension(const FilePath& dir_path);
     47 
     48   // |expected_change| indicates how many extensions should be installed (or
     49   // disabled, if negative).
     50   // 1 means you expect a new install, 0 means you expect an upgrade, -1 means
     51   // you expect a failed upgrade.
     52   bool InstallExtension(const FilePath& path, int expected_change) {
     53     return InstallOrUpdateExtension("", path, INSTALL_UI_TYPE_NONE,
     54                                     expected_change);
     55   }
     56 
     57   // Same as above but passes an id to CrxInstaller and does not allow a
     58   // privilege increase.
     59   bool UpdateExtension(const std::string& id, const FilePath& path,
     60                        int expected_change) {
     61     return InstallOrUpdateExtension(id, path, INSTALL_UI_TYPE_NONE,
     62                                     expected_change);
     63   }
     64 
     65   // Same as |InstallExtension| but with the normal extension UI showing up
     66   // (for e.g. info bar on success).
     67   bool InstallExtensionWithUI(const FilePath& path, int expected_change) {
     68     return InstallOrUpdateExtension("", path, INSTALL_UI_TYPE_NORMAL,
     69                                     expected_change);
     70   }
     71   bool InstallExtensionWithUIAutoConfirm(const FilePath& path,
     72                                          int expected_change,
     73                                          Profile* profile) {
     74     return InstallOrUpdateExtension("", path, INSTALL_UI_TYPE_AUTO_CONFIRM,
     75                                     expected_change, profile);
     76   }
     77 
     78   // Begins install process but simulates a user cancel.
     79   bool StartInstallButCancel(const FilePath& path) {
     80     return InstallOrUpdateExtension("", path, INSTALL_UI_TYPE_CANCEL, 0);
     81   }
     82 
     83   void ReloadExtension(const std::string& extension_id);
     84 
     85   void UnloadExtension(const std::string& extension_id);
     86 
     87   void UninstallExtension(const std::string& extension_id);
     88 
     89   void DisableExtension(const std::string& extension_id);
     90 
     91   void EnableExtension(const std::string& extension_id);
     92 
     93   // Wait for the total number of page actions to change to |count|.
     94   bool WaitForPageActionCountChangeTo(int count);
     95 
     96   // Wait for the number of visible page actions to change to |count|.
     97   bool WaitForPageActionVisibilityChangeTo(int count);
     98 
     99   // Waits until an extension is installed and loaded. Returns true if an
    100   // install happened before timeout.
    101   bool WaitForExtensionInstall();
    102 
    103   // Wait for an extension install error to be raised. Returns true if an
    104   // error was raised.
    105   bool WaitForExtensionInstallError();
    106 
    107   // Waits until an extension is loaded.
    108   void WaitForExtensionLoad();
    109 
    110   // Wait for the specified extension to crash. Returns true if it really
    111   // crashed.
    112   bool WaitForExtensionCrash(const std::string& extension_id);
    113 
    114   // NotificationObserver
    115   virtual void Observe(NotificationType type,
    116                        const NotificationSource& source,
    117                        const NotificationDetails& details);
    118 
    119   bool loaded_;
    120   bool installed_;
    121 
    122   // test_data/extensions.
    123   FilePath test_data_dir_;
    124   std::string last_loaded_extension_id_;
    125   int extension_installs_observed_;
    126 
    127  private:
    128   // Temporary directory for testing.
    129   ScopedTempDir temp_dir_;
    130 
    131   // Specifies the type of UI (if any) to show during installation and what
    132   // user action to simulate.
    133   enum InstallUIType {
    134     INSTALL_UI_TYPE_NONE,
    135     INSTALL_UI_TYPE_CANCEL,
    136     INSTALL_UI_TYPE_NORMAL,
    137     INSTALL_UI_TYPE_AUTO_CONFIRM,
    138   };
    139 
    140   bool InstallOrUpdateExtension(const std::string& id, const FilePath& path,
    141                                 InstallUIType ui_type,
    142                                 int expected_change);
    143   bool InstallOrUpdateExtension(const std::string& id, const FilePath& path,
    144                                 InstallUIType ui_type,
    145                                 int expected_change,
    146                                 Profile* profile);
    147   const Extension* LoadExtensionImpl(const FilePath& path,
    148                                      bool incognito_enabled,
    149                                      bool fileaccess_enabled);
    150 
    151   bool WaitForExtensionHostsToLoad();
    152 
    153   // When waiting for page action count to change, we wait until it reaches this
    154   // value.
    155   int target_page_action_count_;
    156 
    157   // When waiting for visible page action count to change, we wait until it
    158   // reaches this value.
    159   int target_visible_page_action_count_;
    160 };
    161 
    162 #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
    163