1 // Copyright 2013 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_API_SESSIONS_SESSIONS_API_H__ 6 #define CHROME_BROWSER_EXTENSIONS_API_SESSIONS_SESSIONS_API_H__ 7 8 #include <string> 9 10 #include "chrome/browser/extensions/chrome_extension_function.h" 11 #include "chrome/browser/sessions/tab_restore_service.h" 12 #include "chrome/browser/sessions/tab_restore_service_observer.h" 13 #include "chrome/common/extensions/api/sessions.h" 14 #include "chrome/common/extensions/api/tabs.h" 15 #include "chrome/common/extensions/api/windows.h" 16 #include "extensions/browser/browser_context_keyed_api_factory.h" 17 #include "extensions/browser/event_router.h" 18 19 class Profile; 20 21 namespace browser_sync { 22 struct SyncedSession; 23 } 24 25 namespace extensions { 26 27 class SessionId; 28 29 class SessionsGetRecentlyClosedFunction : public ChromeSyncExtensionFunction { 30 protected: ~SessionsGetRecentlyClosedFunction()31 virtual ~SessionsGetRecentlyClosedFunction() {} 32 virtual bool RunSync() OVERRIDE; 33 DECLARE_EXTENSION_FUNCTION("sessions.getRecentlyClosed", 34 SESSIONS_GETRECENTLYCLOSED) 35 36 private: 37 scoped_ptr<api::tabs::Tab> CreateTabModel(const TabRestoreService::Tab& tab, 38 int session_id, 39 int selected_index); 40 scoped_ptr<api::windows::Window> CreateWindowModel( 41 const TabRestoreService::Window& window, 42 int session_id); 43 scoped_ptr<api::sessions::Session> CreateSessionModel( 44 const TabRestoreService::Entry* entry); 45 }; 46 47 class SessionsGetDevicesFunction : public ChromeSyncExtensionFunction { 48 protected: ~SessionsGetDevicesFunction()49 virtual ~SessionsGetDevicesFunction() {} 50 virtual bool RunSync() OVERRIDE; 51 DECLARE_EXTENSION_FUNCTION("sessions.getDevices", SESSIONS_GETDEVICES) 52 53 private: 54 scoped_ptr<api::tabs::Tab> CreateTabModel(const std::string& session_tag, 55 const SessionTab& tab, 56 int tab_index, 57 int selected_index); 58 scoped_ptr<api::windows::Window> CreateWindowModel( 59 const SessionWindow& window, 60 const std::string& session_tag); 61 scoped_ptr<api::sessions::Session> CreateSessionModel( 62 const SessionWindow& window, 63 const std::string& session_tag); 64 scoped_ptr<api::sessions::Device> CreateDeviceModel( 65 const browser_sync::SyncedSession* session); 66 }; 67 68 class SessionsRestoreFunction : public ChromeSyncExtensionFunction { 69 protected: ~SessionsRestoreFunction()70 virtual ~SessionsRestoreFunction() {} 71 virtual bool RunSync() OVERRIDE; 72 DECLARE_EXTENSION_FUNCTION("sessions.restore", SESSIONS_RESTORE) 73 74 private: 75 void SetInvalidIdError(const std::string& invalid_id); 76 void SetResultRestoredTab(content::WebContents* contents); 77 bool SetResultRestoredWindow(int window_id); 78 bool RestoreMostRecentlyClosed(Browser* browser); 79 bool RestoreLocalSession(const SessionId& session_id, Browser* browser); 80 bool RestoreForeignSession(const SessionId& session_id, 81 Browser* browser); 82 }; 83 84 class SessionsEventRouter : public TabRestoreServiceObserver { 85 public: 86 explicit SessionsEventRouter(Profile* profile); 87 virtual ~SessionsEventRouter(); 88 89 // Observer callback for TabRestoreServiceObserver. Sends data on 90 // recently closed tabs to the javascript side of this page to 91 // display to the user. 92 virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE; 93 94 // Observer callback to notice when our associated TabRestoreService 95 // is destroyed. 96 virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE; 97 98 private: 99 Profile* profile_; 100 101 // TabRestoreService that we are observing. 102 TabRestoreService* tab_restore_service_; 103 104 DISALLOW_COPY_AND_ASSIGN(SessionsEventRouter); 105 }; 106 107 class SessionsAPI : public BrowserContextKeyedAPI, 108 public extensions::EventRouter::Observer { 109 public: 110 explicit SessionsAPI(content::BrowserContext* context); 111 virtual ~SessionsAPI(); 112 113 // BrowserContextKeyedService implementation. 114 virtual void Shutdown() OVERRIDE; 115 116 // BrowserContextKeyedAPI implementation. 117 static BrowserContextKeyedAPIFactory<SessionsAPI>* GetFactoryInstance(); 118 119 // EventRouter::Observer implementation. 120 virtual void OnListenerAdded(const extensions::EventListenerInfo& details) 121 OVERRIDE; 122 123 private: 124 friend class BrowserContextKeyedAPIFactory<SessionsAPI>; 125 126 content::BrowserContext* browser_context_; 127 128 // BrowserContextKeyedAPI implementation. service_name()129 static const char* service_name() { 130 return "SessionsAPI"; 131 } 132 static const bool kServiceIsNULLWhileTesting = true; 133 134 // Created lazily upon OnListenerAdded. 135 scoped_ptr<SessionsEventRouter> sessions_event_router_; 136 137 DISALLOW_COPY_AND_ASSIGN(SessionsAPI); 138 }; 139 140 } // namespace extensions 141 142 #endif // CHROME_BROWSER_EXTENSIONS_API_SESSIONS_SESSIONS_API_H__ 143