diff options
Diffstat (limited to 'chrome')
8 files changed, 123 insertions, 16 deletions
diff --git a/chrome/browser/extensions/extension_browser_event_router.cc b/chrome/browser/extensions/extension_browser_event_router.cc index cefef15..c05e793 100644 --- a/chrome/browser/extensions/extension_browser_event_router.cc +++ b/chrome/browser/extensions/extension_browser_event_router.cc @@ -13,6 +13,8 @@ #include "chrome/browser/extensions/extension_tabs_module.h" #include "chrome/common/notification_service.h" +const char* kOnWindowCreated = "window-created"; +const char* kOnWindowRemoved = "window-removed"; const char* kOnTabCreated = "tab-created"; const char* kOnTabMoved = "tab-moved"; const char* kOnTabSelectionChanged = "tab-selection-changed"; @@ -55,10 +57,12 @@ void ExtensionBrowserEventRouter::Observe(NotificationType type, case(NotificationType::BROWSER_OPENED) : browser = Source<Browser>(source).ptr(); browser->tabstrip_model()->AddObserver(this); + BrowserOpened(browser); break; case(NotificationType::BROWSER_CLOSED) : browser = Source<Browser>(source).ptr(); browser->tabstrip_model()->RemoveObserver(this); + BrowserClosed(browser); break; default: NOTREACHED(); @@ -66,6 +70,30 @@ void ExtensionBrowserEventRouter::Observe(NotificationType type, } } +void ExtensionBrowserEventRouter::BrowserOpened(Browser* browser) { + int window_id = ExtensionTabUtil::GetWindowId(browser); + + ListValue args; + args.Append(Value::CreateIntegerValue(window_id)); + + std::string json_args; + JSONWriter::Write(&args, false, &json_args); + + DispatchEvent(browser->profile(), kOnWindowCreated, json_args); +} + +void ExtensionBrowserEventRouter::BrowserClosed(Browser* browser) { + int window_id = ExtensionTabUtil::GetWindowId(browser); + + ListValue args; + args.Append(Value::CreateIntegerValue(window_id)); + + std::string json_args; + JSONWriter::Write(&args, false, &json_args); + + DispatchEvent(browser->profile(), kOnWindowRemoved, json_args); +} + void ExtensionBrowserEventRouter::TabInsertedAt(TabContents* contents, int index, bool foreground) { diff --git a/chrome/browser/extensions/extension_browser_event_router.h b/chrome/browser/extensions/extension_browser_event_router.h index 3a2f5ec..29ec398 100644 --- a/chrome/browser/extensions/extension_browser_event_router.h +++ b/chrome/browser/extensions/extension_browser_event_router.h @@ -45,6 +45,10 @@ class ExtensionBrowserEventRouter : public TabStripModelObserver, const NotificationSource& source, const NotificationDetails& details); private: + // Construct and dispatch windows.onCreated event. + void BrowserOpened(Browser* browser); + // Construct and dispatch windows.onRemoved event. + void BrowserClosed(Browser* browser); ExtensionBrowserEventRouter(); friend struct DefaultSingletonTraits<ExtensionBrowserEventRouter>; diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index 7e6099f..0d45d84 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -53,6 +53,7 @@ FactoryRegistry::FactoryRegistry() { // Tabs factories_["GetWindows"] = &NewExtensionFunction<GetWindowsFunction>; factories_["CreateWindow"] = &NewExtensionFunction<CreateWindowFunction>; + factories_["RemoveWindow"] = &NewExtensionFunction<RemoveWindowFunction>; factories_["GetTabsForWindow"] = &NewExtensionFunction<GetTabsForWindowFunction>; factories_["GetTab"] = &NewExtensionFunction<GetTabFunction>; diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc index 67f4cc6..269ffce 100644 --- a/chrome/browser/extensions/extension_tabs_module.cc +++ b/chrome/browser/extensions/extension_tabs_module.cc @@ -70,10 +70,13 @@ bool GetWindowsFunction::RunImpl() { result_.reset(new ListValue()); for (BrowserList::const_iterator browser = BrowserList::begin(); browser != BrowserList::end(); ++browser) { - if (all_windows || (window_ids.find(ExtensionTabUtil::GetWindowId(*browser)) - != window_ids.end())) { - static_cast<ListValue*>(result_.get())->Append( + // Only examine browsers in the current profile. + if ((*browser)->profile() == profile()) { + if (all_windows || (window_ids.find(ExtensionTabUtil:: + GetWindowId(*browser)) != window_ids.end())) { + static_cast<ListValue*>(result_.get())->Append( CreateWindowValue(*browser)); + } } } @@ -146,11 +149,42 @@ bool CreateWindowFunction::RunImpl() { return true; } +bool RemoveWindowFunction::RunImpl() { + if (!args_->IsType(Value::TYPE_INTEGER)) + return false; + + int window_id; + if (!args_->GetAsInteger(&window_id)) + return false; + + Browser* target = NULL; + for (BrowserList::const_iterator browser = BrowserList::begin(); + browser != BrowserList::end(); ++browser) { + // Only examine browsers in the current profile. + if ((*browser)->profile() == profile()) { + if (ExtensionTabUtil::GetWindowId(*browser) == window_id) { + target = *browser; + break; + } + } + } + + if (target == NULL) { + // TODO(rafaelw): need error message. + return false; + } + + target->CloseWindow(); + + return true; +} + + bool GetTabsForWindowFunction::RunImpl() { if (!args_->IsType(Value::TYPE_NULL)) return false; - Browser* browser = BrowserList::GetLastActive(); + Browser* browser = dispatcher_->browser(); if (!browser) return false; diff --git a/chrome/browser/extensions/extension_tabs_module.h b/chrome/browser/extensions/extension_tabs_module.h index 617fcf9..90c8647 100644 --- a/chrome/browser/extensions/extension_tabs_module.h +++ b/chrome/browser/extensions/extension_tabs_module.h @@ -23,6 +23,9 @@ class GetWindowsFunction : public SyncExtensionFunction { class CreateWindowFunction : public SyncExtensionFunction { virtual bool RunImpl(); }; +class RemoveWindowFunction : public SyncExtensionFunction { + virtual bool RunImpl(); +}; class GetTabsForWindowFunction : public SyncExtensionFunction { virtual bool RunImpl(); }; diff --git a/chrome/renderer/renderer_resources.grd b/chrome/renderer/renderer_resources.grd index cda253b..c59e98c 100755 --- a/chrome/renderer/renderer_resources.grd +++ b/chrome/renderer/renderer_resources.grd @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- This comment is only here because changes to resources are not picked up -without changes to the corresponding grd file. --> +without changes to the corresponding grd file. --> <grit latest_public_release="0" current_release="1"> <outputs> <output filename="grit/renderer_resources.h" type="rc_header"> diff --git a/chrome/renderer/resources/extension_process_bindings.js b/chrome/renderer/resources/extension_process_bindings.js index 1abb06f..199f436 100644 --- a/chrome/renderer/resources/extension_process_bindings.js +++ b/chrome/renderer/resources/extension_process_bindings.js @@ -11,6 +11,7 @@ var chromium; (function() { native function GetNextCallbackId(); native function CreateWindow(); + native function RemoveWindow(); native function GetWindows(); native function GetTabsForWindow(); native function GetTab(); @@ -90,15 +91,15 @@ var chromium; //---------------------------------------------------------------------------- - // Tabs - chromium.tabs = {}; + // Windows + chromium.windows = {}; - chromium.tabs.getWindows = function(windowQuery, callback) { + chromium.windows.getWindows = function(windowQuery, callback) { validate(arguments, arguments.callee.params); sendRequest(GetWindows, windowQuery, callback); }; - chromium.tabs.getWindows.params = [ + chromium.windows.getWindows.params = [ { type: "object", properties: { @@ -113,11 +114,11 @@ var chromium; chromium.types.optFun ]; - chromium.tabs.createWindow = function(createData, callback) { + chromium.windows.createWindow = function(createData, callback) { validate(arguments, arguments.callee.params); sendRequest(CreateWindow, createData, callback); }; - chromium.tabs.createWindow.params = [ + chromium.windows.createWindow.params = [ { type: "object", properties: { @@ -131,6 +132,31 @@ var chromium; }, chromium.types.optFun ]; + + chromium.windows.removeWindow = function(windowId, callback) { + validate(arguments, arguments.callee.params); + sendRequest(RemoveWindow, windowId, callback); + }; + + chromium.windows.removeWindow.params = [ + chromium.types.pInt, + chromium.types.optFun + ]; + + // sends (windowId). + // *WILL* be followed by tab-attached AND then tab-selection-changed. + chromium.windows.onWindowCreated = new chromium.Event("window-created"); + + // sends (windowId). + // *WILL* be preceded by sequences of tab-removed AND then + // tab-selection-changed -- one for each tab that was contained in the window + // that closed + chromium.windows.onWindowRemoved = new chromium.Event("window-removed"); + + //---------------------------------------------------------------------------- + + // Tabs + chromium.tabs = {}; // TODO(aa): This should eventually take an optional windowId param. chromium.tabs.getTabsForWindow = function(callback) { diff --git a/chrome/test/data/extensions/samples/tabs/tabs_api.html b/chrome/test/data/extensions/samples/tabs/tabs_api.html index a506fd2..022d1a7 100644 --- a/chrome/test/data/extensions/samples/tabs/tabs_api.html +++ b/chrome/test/data/extensions/samples/tabs/tabs_api.html @@ -7,7 +7,7 @@ tabs = {}; tabIds = []; function loadWindowList() { - chromium.tabs.getWindows(undefined, function(windowList) { + chromium.windows.getWindows(undefined, function(windowList) { tabs = {}; tabIds = []; for (var i = 0; i < windowList.length; i++) { @@ -84,6 +84,16 @@ function clearLog() { document.getElementById('log').innerHTML = ''; } +chromium.windows.onWindowCreated.addListener(function(windowId) { + appendToLog('onWindowCreated -- window: ' + windowId); + loadWindowList(); +}); + +chromium.windows.onWindowRemoved.addListener(function(windowId) { + appendToLog('onWindowRemoved -- window: ' + windowId); + loadWindowList(); +}); + chromium.tabs.onTabCreated.addListener(function(data) { appendToLog('onTabCreated -- window: ' + data.windowId + ' tab: ' + data.tabId + ' index ' + data.index); loadWindowList(); @@ -109,8 +119,8 @@ chromium.tabs.onTabSelectionChanged.addListener(function(data) { loadWindowList(); }); -chromium.tabs.onTabRemoved.addListener(function(data) { - appendToLog('onTabRemoved -- window: ' + data.windowId + ' tab: ' + data.tabId + ' index ' + data.index); +chromium.tabs.onTabRemoved.addListener(function(tabId) { + appendToLog('onTabRemoved -- tab: ' + tabId); loadWindowList(); }); @@ -138,7 +148,7 @@ function createWindow() { if (!args.url) delete args.url; - chromium.tabs.createWindow(args); + chromium.windows.createWindow(args); } </script> @@ -181,6 +191,7 @@ function createWindow() { <button onclick="chromium.tabs.removeTab(this.jstdata);" jsvalues=".jstdata:id">Close Tab</button> </div> </div> + <button onclick="chromium.windows.removeWindow(this.jstdata);" jsvalues=".jstdata:id">Close Window</button> </div> </div> <div style="background-color: #EEEEBB; margin: 20px; padding: 8px"> @@ -228,7 +239,7 @@ function createWindow() { <button onclick="updateAll();">Update All</button> <button onclick="moveAll();">Move All</button> <button onclick="clearLog();">-->Clear Log</button> - <button onclick="chromium.tabs.createWindow();">New Window</button> + <button onclick="chromium.windows.createWindow();">New Window</button> </div> <div id="log" style="background-color: #EEAAEE; margin: 20px; padding: 8px"> </div> |