Remove the last c/b/e/extension_service.h includes from src/extensions

This breaks another unwanted dependency from src/extensions back to src/chrome.

* Move PendingExtensionManager and PendingExtensionInfo back into chrome, as
  they are tied to the concepts of extension install/update and we have
  decided to keep that functionality in chrome for now.
* Eliminate unused include in extension_function.cc

No functional changes.

BUG=none
TEST=compiles
[email protected] for header file move touching chrome/browser/sync/test/integration/sync_extension_helper.cc

Review URL: https://codereview.chromium.org/195763017

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257203 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/pending_extension_manager.h b/chrome/browser/extensions/pending_extension_manager.h
new file mode 100644
index 0000000..4c3572c
--- /dev/null
+++ b/chrome/browser/extensions/pending_extension_manager.h
@@ -0,0 +1,155 @@
+// 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.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_MANAGER_H_
+#define CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_MANAGER_H_
+
+#include <list>
+#include <string>
+
+#include "chrome/browser/extensions/pending_extension_info.h"
+#include "extensions/common/manifest.h"
+
+class ExtensionServiceInterface;
+class GURL;
+
+namespace base {
+class Version;
+}
+
+FORWARD_DECLARE_TEST(ExtensionServiceTest,
+                     UpdatePendingExtensionAlreadyInstalled);
+
+namespace extensions {
+class Extension;
+class PendingExtensionManager;
+
+class ExtensionUpdaterTest;
+void SetupPendingExtensionManagerForTest(
+    int count, const GURL& update_url,
+    PendingExtensionManager* pending_extension_manager);
+
+// Class PendingExtensionManager manages the set of extensions which are
+// being installed or updated. In general, installation and updates take
+// time, because they involve downloading, unpacking, and installing.
+// This class allows us to avoid race cases where multiple sources install
+// the same extension.
+// The extensions service creates an instance of this class, and manages
+// its lifetime. This class should only be used from the UI thread.
+class PendingExtensionManager {
+ public:
+  // |service| is a reference to the ExtensionService whose pending
+  // extensions we are managing. The service creates an instance of
+  // this class on construction, and destroys it on destruction.
+  // The service remains valid over the entire lifetime of this class.
+  explicit PendingExtensionManager(const ExtensionServiceInterface& service);
+  ~PendingExtensionManager();
+
+  // TODO(skerner): Many of these methods can be private once code in
+  // ExtensionService is moved into methods of this class.
+
+  // Remove extension with id |id| from the set of pending extensions. Returns
+  // true if such an extension was found and removed, false otherwise.
+  bool Remove(const std::string& id);
+
+  // Get the  information for a pending extension.  Returns a pointer to the
+  // pending extension with id |id|, or NULL if there is no such extension.
+  const PendingExtensionInfo* GetById(const std::string& id) const;
+
+  // Is |id| in the set of pending extensions?
+  bool IsIdPending(const std::string& id) const;
+
+  // Returns true if there are any extensions pending.
+  bool HasPendingExtensions() const;
+
+  // Whether there is pending extension install from sync.
+  bool HasPendingExtensionFromSync() const;
+
+  // Adds an extension in a pending state; the extension with the
+  // given info will be installed on the next auto-update cycle.
+  // Return true if the extension was added.  Will return false
+  // if the extension is pending from another source which overrides
+  // sync installs (such as a policy extension) or if the extension
+  // is already installed.
+  //
+  // TODO(akalin): Replace |install_silently| with a list of
+  // pre-enabled permissions.
+  bool AddFromSync(
+      const std::string& id,
+      const GURL& update_url,
+      PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install,
+      bool install_silently);
+
+  // Adds an extension that was depended on by another extension.
+  bool AddFromExtensionImport(
+      const std::string& id,
+      const GURL& update_url,
+      PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install);
+
+  // Given an extension id and an update URL, schedule the extension
+  // to be fetched, installed, and activated.
+  bool AddFromExternalUpdateUrl(const std::string& id,
+                                const GURL& update_url,
+                                Manifest::Location location,
+                                int creation_flags,
+                                bool mark_acknowledged);
+
+  // Add a pending extension record for an external CRX file.
+  // Return true if the CRX should be installed, false if an existing
+  // pending record overrides it.
+  bool AddFromExternalFile(
+      const std::string& id,
+      Manifest::Location location,
+      const base::Version& version,
+      int creation_flags,
+      bool mark_acknowledged);
+
+  // Get the list of pending IDs that should be installed from an update URL.
+  // Pending extensions that will be installed from local files will not be
+  // included in the set.
+  void GetPendingIdsForUpdateCheck(
+      std::list<std::string>* out_ids_for_update_check) const;
+
+ private:
+  typedef std::list<PendingExtensionInfo> PendingExtensionList;
+
+  // Assumes an extension with id |id| is not already installed.
+  // Return true if the extension was added.
+  bool AddExtensionImpl(
+      const std::string& id,
+      const GURL& update_url,
+      const base::Version& version,
+      PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install,
+      bool is_from_sync,
+      bool install_silently,
+      Manifest::Location install_source,
+      int creation_flags,
+      bool mark_acknowledged);
+
+  // Add a pending extension record directly.  Used for unit tests that need
+  // to set an inital state. Use friendship to allow the tests to call this
+  // method.
+  void AddForTesting(const PendingExtensionInfo& pending_extension_info);
+
+  // Reference to the extension service whose pending extensions this class is
+  // managing.  Because this class is a member of |service_|, it is created
+  // and destroyed with |service_|. We only use methods from the interface
+  // ExtensionServiceInterface.
+  const ExtensionServiceInterface& service_;
+
+  PendingExtensionList pending_extension_list_;
+
+  FRIEND_TEST_ALL_PREFIXES(::ExtensionServiceTest,
+                           UpdatePendingExtensionAlreadyInstalled);
+  friend class ExtensionUpdaterTest;
+  friend void SetupPendingExtensionManagerForTest(
+      int count, const GURL& update_url,
+      PendingExtensionManager* pending_extension_manager);
+
+  DISALLOW_COPY_AND_ASSIGN(PendingExtensionManager);
+};
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_MANAGER_H_