summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions
diff options
context:
space:
mode:
authorwjywbs@gmail.com <wjywbs@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-30 20:48:55 +0000
committerwjywbs@gmail.com <wjywbs@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-30 20:48:55 +0000
commit38f9258e83b4ce3e01f15c2e3009f43508892878 (patch)
treec063bae0d6fba28cfc95ce1fe8e761bdcccf1a98 /chrome/browser/extensions
parent944074f23a24f063cfbaee41490aec7a23588ee5 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/extensions/api/sessions/sessions_api.cc56
-rw-r--r--chrome/browser/extensions/api/sessions/sessions_api.h58
-rw-r--r--chrome/browser/extensions/browser_context_keyed_service_factories.cc2
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)