diff options
author | wjywbs@gmail.com <wjywbs@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-30 20:48:55 +0000 |
---|---|---|
committer | wjywbs@gmail.com <wjywbs@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-30 20:48:55 +0000 |
commit | 38f9258e83b4ce3e01f15c2e3009f43508892878 (patch) | |
tree | c063bae0d6fba28cfc95ce1fe8e761bdcccf1a98 /chrome/browser/extensions | |
parent | 944074f23a24f063cfbaee41490aec7a23588ee5 (diff) | |
download | chromium_src-38f9258e83b4ce3e01f15c2e3009f43508892878.zip chromium_src-38f9258e83b4ce3e01f15c2e3009f43508892878.tar.gz chromium_src-38f9258e83b4ce3e01f15c2e3009f43508892878.tar.bz2 |
Add onChanged callback for chrome.sessions API.
Currently there is no method to receive the changes of recently closed pages
in chrome.sessions APIs. This callback can give extensions a chance to know
there is a change and update by calling GetRecentlyClosed again.
R=kalman@chromium.org
BUG=353007
Review URL: https://codereview.chromium.org/201393002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@260464 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
3 files changed, 116 insertions, 0 deletions
diff --git a/chrome/browser/extensions/api/sessions/sessions_api.cc b/chrome/browser/extensions/api/sessions/sessions_api.cc index eca014e..0774d82 100644 --- a/chrome/browser/extensions/api/sessions/sessions_api.cc +++ b/chrome/browser/extensions/api/sessions/sessions_api.cc @@ -35,6 +35,7 @@ #include "content/public/browser/web_contents.h" #include "extensions/browser/extension_function_dispatcher.h" #include "extensions/browser/extension_function_registry.h" +#include "extensions/browser/extension_system.h" #include "extensions/common/error_utils.h" #include "net/base/net_util.h" #include "ui/base/layout.h" @@ -593,4 +594,59 @@ bool SessionsRestoreFunction::RunImpl() { : RestoreLocalSession(*session_id, browser); } +SessionsEventRouter::SessionsEventRouter(Profile* profile) + : profile_(profile), + tab_restore_service_(TabRestoreServiceFactory::GetForProfile(profile)) { + // TabRestoreServiceFactory::GetForProfile() can return NULL (i.e., when in + // incognito mode) + if (tab_restore_service_) { + tab_restore_service_->LoadTabsFromLastSession(); + tab_restore_service_->AddObserver(this); + } +} + +SessionsEventRouter::~SessionsEventRouter() { + if (tab_restore_service_) + tab_restore_service_->RemoveObserver(this); +} + +void SessionsEventRouter::TabRestoreServiceChanged( + TabRestoreService* service) { + scoped_ptr<base::ListValue> args(new base::ListValue()); + EventRouter::Get(profile_)->BroadcastEvent(make_scoped_ptr( + new Event(api::sessions::OnChanged::kEventName, args.Pass()))); +} + +void SessionsEventRouter::TabRestoreServiceDestroyed( + TabRestoreService* service) { + tab_restore_service_ = NULL; +} + +SessionsAPI::SessionsAPI(content::BrowserContext* context) + : browser_context_(context) { + EventRouter::Get(browser_context_)->RegisterObserver(this, + api::sessions::OnChanged::kEventName); +} + +SessionsAPI::~SessionsAPI() { +} + +void SessionsAPI::Shutdown() { + EventRouter::Get(browser_context_)->UnregisterObserver(this); +} + +static base::LazyInstance<BrowserContextKeyedAPIFactory<SessionsAPI> > + g_factory = LAZY_INSTANCE_INITIALIZER; + +BrowserContextKeyedAPIFactory<SessionsAPI>* +SessionsAPI::GetFactoryInstance() { + return g_factory.Pointer(); +} + +void SessionsAPI::OnListenerAdded(const EventListenerInfo& details) { + sessions_event_router_.reset( + new SessionsEventRouter(Profile::FromBrowserContext(browser_context_))); + EventRouter::Get(browser_context_)->UnregisterObserver(this); +} + } // namespace extensions diff --git a/chrome/browser/extensions/api/sessions/sessions_api.h b/chrome/browser/extensions/api/sessions/sessions_api.h index e044019..49b00bb 100644 --- a/chrome/browser/extensions/api/sessions/sessions_api.h +++ b/chrome/browser/extensions/api/sessions/sessions_api.h @@ -13,6 +13,8 @@ #include "chrome/common/extensions/api/sessions.h" #include "chrome/common/extensions/api/tabs.h" #include "chrome/common/extensions/api/windows.h" +#include "extensions/browser/browser_context_keyed_api_factory.h" +#include "extensions/browser/event_router.h" class Profile; @@ -79,6 +81,62 @@ class SessionsRestoreFunction : public ChromeSyncExtensionFunction { Browser* browser); }; +class SessionsEventRouter : public TabRestoreServiceObserver { + public: + explicit SessionsEventRouter(Profile* profile); + virtual ~SessionsEventRouter(); + + // Observer callback for TabRestoreServiceObserver. Sends data on + // recently closed tabs to the javascript side of this page to + // display to the user. + virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE; + + // Observer callback to notice when our associated TabRestoreService + // is destroyed. + virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE; + + private: + Profile* profile_; + + // TabRestoreService that we are observing. + TabRestoreService* tab_restore_service_; + + DISALLOW_COPY_AND_ASSIGN(SessionsEventRouter); +}; + +class SessionsAPI : public BrowserContextKeyedAPI, + public extensions::EventRouter::Observer { + public: + explicit SessionsAPI(content::BrowserContext* context); + virtual ~SessionsAPI(); + + // BrowserContextKeyedService implementation. + virtual void Shutdown() OVERRIDE; + + // BrowserContextKeyedAPI implementation. + static BrowserContextKeyedAPIFactory<SessionsAPI>* GetFactoryInstance(); + + // EventRouter::Observer implementation. + virtual void OnListenerAdded(const extensions::EventListenerInfo& details) + OVERRIDE; + + private: + friend class BrowserContextKeyedAPIFactory<SessionsAPI>; + + content::BrowserContext* browser_context_; + + // BrowserContextKeyedAPI implementation. + static const char* service_name() { + return "SessionsAPI"; + } + static const bool kServiceIsNULLWhileTesting = true; + + // Created lazily upon OnListenerAdded. + scoped_ptr<SessionsEventRouter> sessions_event_router_; + + DISALLOW_COPY_AND_ASSIGN(SessionsAPI); +}; + } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_API_SESSIONS_SESSIONS_API_H__ diff --git a/chrome/browser/extensions/browser_context_keyed_service_factories.cc b/chrome/browser/extensions/browser_context_keyed_service_factories.cc index 7a4a27d..a3318f1 100644 --- a/chrome/browser/extensions/browser_context_keyed_service_factories.cc +++ b/chrome/browser/extensions/browser_context_keyed_service_factories.cc @@ -36,6 +36,7 @@ #include "chrome/browser/extensions/api/push_messaging/push_messaging_api.h" #include "chrome/browser/extensions/api/runtime/runtime_api.h" #include "chrome/browser/extensions/api/serial/serial_connection.h" +#include "chrome/browser/extensions/api/sessions/sessions_api.h" #include "chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h" #include "chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h" #include "chrome/browser/extensions/api/streams_private/streams_private_api.h" @@ -132,6 +133,7 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt() { extensions::ProcessesAPI::GetFactoryInstance(); extensions::PushMessagingAPI::GetFactoryInstance(); extensions::RuntimeAPI::GetFactoryInstance(); + extensions::SessionsAPI::GetFactoryInstance(); extensions::SettingsOverridesAPI::GetFactoryInstance(); extensions::SignedInDevicesManager::GetFactoryInstance(); #if defined(ENABLE_SPELLCHECK) |