summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/extensions/extension_browser_event_router.cc28
-rw-r--r--chrome/browser/extensions/extension_browser_event_router.h4
-rw-r--r--chrome/browser/extensions/extension_function_dispatcher.cc1
-rw-r--r--chrome/browser/extensions/extension_tabs_module.cc42
-rw-r--r--chrome/browser/extensions/extension_tabs_module.h3
-rwxr-xr-xchrome/renderer/renderer_resources.grd2
-rw-r--r--chrome/renderer/resources/extension_process_bindings.js38
-rw-r--r--chrome/test/data/extensions/samples/tabs/tabs_api.html21
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>