// Copyright (c) 2011 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_BACKGROUND_CONTENTS_SERVICE_H_ #define CHROME_BROWSER_BACKGROUND_CONTENTS_SERVICE_H_ #pragma once #include <map> #include <vector> #include "base/gtest_prod_util.h" #include "base/memory/ref_counted.h" #include "base/task.h" #include "chrome/browser/profiles/profile_keyed_service.h" #include "chrome/browser/tab_contents/background_contents.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" #include "content/common/window_container_type.h" #include "googleurl/src/gurl.h" #include "webkit/glue/window_open_disposition.h" class CommandLine; class DictionaryValue; class NotificationDelegate; class PrefService; class Profile; class TabContents; namespace gfx { class Rect; } struct BackgroundContentsOpenedDetails; // BackgroundContentsService is owned by the profile, and is responsible for // managing the lifetime of BackgroundContents (tracking the set of background // urls, loading them at startup, and keeping the browser process alive as long // as there are BackgroundContents loaded). // // It is also responsible for tracking the association between // BackgroundContents and their parent app, and shutting them down when the // parent app is unloaded. class BackgroundContentsService : private NotificationObserver, public BackgroundContents::Delegate, public ProfileKeyedService { public: BackgroundContentsService(Profile* profile, const CommandLine* command_line); virtual ~BackgroundContentsService(); // Returns the BackgroundContents associated with the passed application id, // or NULL if none. BackgroundContents* GetAppBackgroundContents(const string16& appid); // Returns all currently opened BackgroundContents (used by the task manager). std::vector<BackgroundContents*> GetBackgroundContents() const; static void RegisterUserPrefs(PrefService* prefs); // BackgroundContents::Delegate implementation. virtual void AddTabContents(TabContents* new_contents, WindowOpenDisposition disposition, const gfx::Rect& initial_pos, bool user_gesture); // Gets the parent application id for the passed BackgroundContents. Returns // an empty string if no parent application found (e.g. passed // BackgroundContents has already shut down). const string16& GetParentApplicationId(BackgroundContents* contents) const; // Creates a new BackgroundContents using the passed |site| and // the |route_id| and begins tracking the object internally so it can be // shutdown if the parent application is uninstalled. // A BACKGROUND_CONTENTS_OPENED notification will be generated with the passed // |frame_name| and |application_id| values, using the passed |profile| as the // Source.. BackgroundContents* CreateBackgroundContents(SiteInstance* site, int route_id, Profile* profile, const string16& frame_name, const string16& application_id); // Load the manifest-specified background page for the specified hosted app. // If the manifest doesn't specify one, then load the BackgroundContents // registered in the pref. This is typically used to reload a crashed // background page. void LoadBackgroundContentsForExtension(Profile* profile, const std::string& extension_id); private: friend class BackgroundContentsServiceTest; friend class MockBackgroundContents; friend class TaskManagerBrowserTest; FRIEND_TEST_ALL_PREFIXES(BackgroundContentsServiceTest, BackgroundContentsCreateDestroy); FRIEND_TEST_ALL_PREFIXES(BackgroundContentsServiceTest, TestApplicationIDLinkage); FRIEND_TEST_ALL_PREFIXES(TaskManagerBrowserTest, NoticeBGContentsChanges); FRIEND_TEST_ALL_PREFIXES(TaskManagerBrowserTest, KillBGContents); // Registers for various notifications. void StartObserving(Profile* profile); // NotificationObserver implementation. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); // Loads all registered BackgroundContents at startup. void LoadBackgroundContentsFromPrefs(Profile* profile); // Load a BackgroundContent; the settings are read from the provided // dictionary. void LoadBackgroundContentsFromDictionary(Profile* profile, const std::string& extension_id, const DictionaryValue* contents); // Load the manifest-specified BackgroundContents for all apps for the // profile. void LoadBackgroundContentsFromManifests(Profile* profile); // Creates a single BackgroundContents associated with the specified |appid|, // creates an associated RenderView with the name specified by |frame_name|, // and navigates to the passed |url|. void LoadBackgroundContents(Profile* profile, const GURL& url, const string16& frame_name, const string16& appid); // Invoked when a new BackgroundContents is opened. void BackgroundContentsOpened(BackgroundContentsOpenedDetails* details); // Invoked when a BackgroundContents object is destroyed. void BackgroundContentsShutdown(BackgroundContents* contents); // Registers the |contents->GetURL()| to be run at startup. Only happens for // the first navigation after window.open() (future calls to // RegisterBackgroundContents() for the same BackgroundContents will do // nothing). void RegisterBackgroundContents(BackgroundContents* contents); // Stops loading the passed BackgroundContents on startup. void UnregisterBackgroundContents(BackgroundContents* contents); // Unregisters and deletes the BackgroundContents associated with the // passed extension. void ShutdownAssociatedBackgroundContents(const string16& appid); // Returns true if this BackgroundContents is in the contents_list_. bool IsTracked(BackgroundContents* contents) const; // PrefService used to store list of background pages (or NULL if this is // running under an incognito profile). PrefService* prefs_; NotificationRegistrar registrar_; // Information we track about each BackgroundContents. struct BackgroundContentsInfo { // The BackgroundContents whose information we are tracking. BackgroundContents* contents; // The name of the top level frame for this BackgroundContents. string16 frame_name; }; // Map associating currently loaded BackgroundContents with their parent // applications. // Key: application id // Value: BackgroundContentsInfo for the BC associated with that application typedef std::map<string16, BackgroundContentsInfo> BackgroundContentsMap; BackgroundContentsMap contents_map_; DISALLOW_COPY_AND_ASSIGN(BackgroundContentsService); }; #endif // CHROME_BROWSER_BACKGROUND_CONTENTS_SERVICE_H_