summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/extensions/extension_function_dispatcher.cc3
-rw-r--r--chrome/browser/extensions/extension_management_api.cc25
-rw-r--r--chrome/browser/extensions/extension_management_api.h6
-rw-r--r--chrome/browser/extensions/extension_management_api_browsertest.cc13
-rw-r--r--chrome/common/extensions/api/extension_api.json21
-rw-r--r--chrome/common/extensions/docs/experimental.management.html240
-rw-r--r--chrome/test/data/extensions/management/launch_app/background.html1
-rw-r--r--chrome/test/data/extensions/management/launch_app/manifest.json6
-rw-r--r--chrome/test/data/extensions/management/launch_app/test.js30
-rw-r--r--chrome/test/data/extensions/management/packaged_app/main.html8
-rw-r--r--chrome/test/data/extensions/management/packaged_app/manifest.json9
-rw-r--r--chrome/test/data/extensions/management/simple_extension/manifest.json4
12 files changed, 364 insertions, 2 deletions
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc
index 6751671..c1867ca 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.cc
+++ b/chrome/browser/extensions/extension_function_dispatcher.cc
@@ -273,13 +273,14 @@ void FactoryRegistry::ResetFunctions() {
// Management.
RegisterFunction<GetAllExtensionsFunction>();
+ RegisterFunction<LaunchAppFunction>();
RegisterFunction<SetEnabledFunction>();
- RegisterFunction<InstallFunction>();
RegisterFunction<UninstallFunction>();
// WebstorePrivate.
RegisterFunction<GetSyncLoginFunction>();
RegisterFunction<GetStoreLoginFunction>();
+ RegisterFunction<InstallFunction>();
RegisterFunction<SetStoreLoginFunction>();
}
diff --git a/chrome/browser/extensions/extension_management_api.cc b/chrome/browser/extensions/extension_management_api.cc
index 95447a6..43f13f0 100644
--- a/chrome/browser/extensions/extension_management_api.cc
+++ b/chrome/browser/extensions/extension_management_api.cc
@@ -38,9 +38,10 @@ const char kNameKey[] = "name";
const char kOptionsUrlKey[] = "optionsUrl";
const char kSizeKey[] = "size";
const char kUrlKey[] = "url";
+const char kVersionKey[] = "version";
const char kNoExtensionError[] = "No extension with id *";
-
+const char kNotAnAppError[] = "Extension * is not an App";
}
ExtensionsService* ExtensionManagementFunction::service() {
@@ -54,6 +55,7 @@ static DictionaryValue* CreateExtensionInfo(const Extension& extension,
info->SetBoolean(kIsAppKey, extension.is_app());
info->SetString(kNameKey, extension.name());
info->SetBoolean(kEnabledKey, enabled);
+ info->SetString(kVersionKey, extension.VersionString());
if (!extension.options_url().is_empty())
info->SetString(kOptionsUrlKey,
extension.options_url().possibly_invalid_spec());
@@ -102,6 +104,27 @@ bool GetAllExtensionsFunction::RunImpl() {
return true;
}
+bool LaunchAppFunction::RunImpl() {
+ std::string extension_id;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id));
+ Extension* extension = service()->GetExtensionById(extension_id, true);
+ if (!extension) {
+ error_ = ExtensionErrorUtils::FormatErrorMessage(kNoExtensionError,
+ extension_id);
+ return false;
+ }
+ if (!extension->is_app()) {
+ error_ = ExtensionErrorUtils::FormatErrorMessage(kNotAnAppError,
+ extension_id);
+ return false;
+ }
+
+ extension_misc::LaunchContainer container = extension->launch_container();
+ Browser::OpenApplication(profile(), extension, container);
+
+ return true;
+}
+
bool SetEnabledFunction::RunImpl() {
std::string extension_id;
bool enable;
diff --git a/chrome/browser/extensions/extension_management_api.h b/chrome/browser/extensions/extension_management_api.h
index 841baea..4109886 100644
--- a/chrome/browser/extensions/extension_management_api.h
+++ b/chrome/browser/extensions/extension_management_api.h
@@ -24,6 +24,12 @@ class GetAllExtensionsFunction : public ExtensionManagementFunction {
DECLARE_EXTENSION_FUNCTION_NAME("experimental.management.getAll");
};
+class LaunchAppFunction : public ExtensionManagementFunction {
+ ~LaunchAppFunction() {}
+ virtual bool RunImpl();
+ DECLARE_EXTENSION_FUNCTION_NAME("experimental.management.launchApp");
+};
+
class SetEnabledFunction : public ExtensionManagementFunction {
~SetEnabledFunction() {}
virtual bool RunImpl();
diff --git a/chrome/browser/extensions/extension_management_api_browsertest.cc b/chrome/browser/extensions/extension_management_api_browsertest.cc
index 63fdfcf..643072d 100644
--- a/chrome/browser/extensions/extension_management_api_browsertest.cc
+++ b/chrome/browser/extensions/extension_management_api_browsertest.cc
@@ -28,3 +28,16 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementApiBrowserTest, InstallEvent) {
test_data_dir_.AppendASCII("api_test/management/enabled_extension")));
ASSERT_TRUE(listener2.WaitUntilSatisfied());
}
+
+IN_PROC_BROWSER_TEST_F(ExtensionManagementApiBrowserTest, LaunchApp) {
+ ExtensionTestMessageListener listener1("app_launched");
+ ExtensionTestMessageListener listener2("got_expected_error");
+ ASSERT_TRUE(LoadExtension(
+ test_data_dir_.AppendASCII("management/simple_extension")));
+ ASSERT_TRUE(LoadExtension(
+ test_data_dir_.AppendASCII("management/packaged_app")));
+ ASSERT_TRUE(LoadExtension(
+ test_data_dir_.AppendASCII("management/launch_app")));
+ ASSERT_TRUE(listener1.WaitUntilSatisfied());
+ ASSERT_TRUE(listener2.WaitUntilSatisfied());
+}
diff --git a/chrome/common/extensions/api/extension_api.json b/chrome/common/extensions/api/extension_api.json
index 0583904..edbfdc1 100644
--- a/chrome/common/extensions/api/extension_api.json
+++ b/chrome/common/extensions/api/extension_api.json
@@ -3939,6 +3939,10 @@
"description": "The name of this extension or app.",
"type": "string"
},
+ "version": {
+ "description": "The <a href='manifest.html#version'>version</a> of this extension or app.",
+ "type": "string"
+ },
"enabled": {
"description": "Whether it is currently enabled or disabled.",
"type": "boolean"
@@ -4031,6 +4035,23 @@
"parameters": []
}
]
+ },
+ {
+ "name": "launchApp",
+ "description": "Launches an application.",
+ "parameters": [
+ {
+ "name": "id",
+ "type": "string",
+ "description": "The extension id of the application."
+ },
+ {
+ "name": "callback",
+ "type": "function",
+ "optional": "true",
+ "parameters": []
+ }
+ ]
}
],
"events": [
diff --git a/chrome/common/extensions/docs/experimental.management.html b/chrome/common/extensions/docs/experimental.management.html
index 663f432..2e13052 100644
--- a/chrome/common/extensions/docs/experimental.management.html
+++ b/chrome/common/extensions/docs/experimental.management.html
@@ -258,6 +258,8 @@
<li>
<a href="#method-getAll">getAll</a>
</li><li>
+ <a href="#method-launchApp">launchApp</a>
+ </li><li>
<a href="#method-setEnabled">setEnabled</a>
</li><li>
<a href="#method-uninstall">uninstall</a>
@@ -523,6 +525,186 @@
</div> <!-- /description -->
</div><div class="apiItem">
+ <a name="method-launchApp"></a> <!-- method-anchor -->
+ <h4>launchApp</h4>
+
+ <div class="summary"><span style="display: none; ">void</span>
+ <!-- Note: intentionally longer 80 columns -->
+ <span>chrome.experimental.management.launchApp</span>(<span class="null"><span style="display: none; ">, </span><span>string</span>
+ <var><span>id</span></var></span><span class="optional"><span>, </span><span>function</span>
+ <var><span>callback</span></var></span>)</div>
+
+ <div class="description">
+ <p class="todo" style="display: none; ">Undocumented.</p>
+ <p>Launches an application.</p>
+
+ <!-- PARAMETERS -->
+ <h4>Parameters</h4>
+ <dl>
+ <div>
+ <div>
+ <dt>
+ <var>id</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional" style="display: none; ">optional</span>
+ <span class="enum" style="display: none; ">enumerated</span>
+ <span id="typeTemplate">
+ <span style="display: none; ">
+ <a> Type</a>
+ </span>
+ <span>
+ <span style="display: none; ">
+ array of <span><span></span></span>
+ </span>
+ <span>string</span>
+ <span style="display: none; "></span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo" style="display: none; ">
+ Undocumented.
+ </dd>
+ <dd>The extension id of the application.</dd>
+ <dd style="display: none; ">
+ This parameter was added in version
+ <b><span></span></b>.
+ You must omit this parameter in earlier versions,
+ and you may omit it in any version. If you require this
+ parameter, the manifest key
+ <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
+ can ensure that your extension won't be run in an earlier browser version.
+ </dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd style="display: none; ">
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+
+ <!-- FUNCTION PARAMETERS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ </div>
+ </div><div>
+ <div>
+ <dt>
+ <var>callback</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional">optional</span>
+ <span class="enum" style="display: none; ">enumerated</span>
+ <span id="typeTemplate">
+ <span style="display: none; ">
+ <a> Type</a>
+ </span>
+ <span>
+ <span style="display: none; ">
+ array of <span><span></span></span>
+ </span>
+ <span>function</span>
+ <span style="display: none; "></span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo">
+ Undocumented.
+ </dd>
+ <dd style="display: none; ">
+ Description of this parameter from the json schema.
+ </dd>
+ <dd style="display: none; ">
+ This parameter was added in version
+ <b><span></span></b>.
+ You must omit this parameter in earlier versions,
+ and you may omit it in any version. If you require this
+ parameter, the manifest key
+ <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
+ can ensure that your extension won't be run in an earlier browser version.
+ </dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd style="display: none; ">
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+
+ <!-- FUNCTION PARAMETERS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ </div>
+ </div>
+ </dl>
+
+ <!-- RETURNS -->
+ <h4 style="display: none; ">Returns</h4>
+ <dl>
+ <div style="display: none; ">
+ <div>
+ </div>
+ </div>
+ </dl>
+
+ <!-- CALLBACK -->
+ <div>
+ <div>
+ <h4>Callback function</h4>
+ <p style="display: none; ">
+ The callback <em>parameter</em> should specify a function
+ that looks like this:
+ </p>
+ <p>
+ If you specify the <em>callback</em> parameter, it should
+ specify a function that looks like this:
+ </p>
+
+ <!-- Note: intentionally longer 80 columns -->
+ <pre>function(<span></span>) <span class="subdued">{...}</span>;</pre>
+ <dl>
+ <div style="display: none; ">
+ <div>
+ </div>
+ </div>
+ </dl>
+ </div>
+ </div>
+
+ <!-- MIN_VERSION -->
+ <p style="display: none; ">
+ This function was added in version <b><span></span></b>.
+ If you require this function, the manifest key
+ <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
+ can ensure that your extension won't be run in an earlier browser version.
+ </p>
+ </div> <!-- /description -->
+
+ </div><div class="apiItem">
<a name="method-setEnabled"></a> <!-- method-anchor -->
<h4>setEnabled</h4>
@@ -1627,6 +1809,64 @@
</div><div>
<div>
<dt>
+ <var>version</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional" style="display: none; ">optional</span>
+ <span class="enum" style="display: none; ">enumerated</span>
+ <span id="typeTemplate">
+ <span style="display: none; ">
+ <a> Type</a>
+ </span>
+ <span>
+ <span style="display: none; ">
+ array of <span><span></span></span>
+ </span>
+ <span>string</span>
+ <span style="display: none; "></span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo" style="display: none; ">
+ Undocumented.
+ </dd>
+ <dd>The <a href="manifest.html#version">version</a> of this extension or app.</dd>
+ <dd style="display: none; ">
+ This parameter was added in version
+ <b><span></span></b>.
+ You must omit this parameter in earlier versions,
+ and you may omit it in any version. If you require this
+ parameter, the manifest key
+ <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
+ can ensure that your extension won't be run in an earlier browser version.
+ </dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd style="display: none; ">
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+
+ <!-- FUNCTION PARAMETERS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ </div>
+ </div><div>
+ <div>
+ <dt>
<var>enabled</var>
<em>
diff --git a/chrome/test/data/extensions/management/launch_app/background.html b/chrome/test/data/extensions/management/launch_app/background.html
new file mode 100644
index 0000000..46f4d74
--- /dev/null
+++ b/chrome/test/data/extensions/management/launch_app/background.html
@@ -0,0 +1 @@
+<script src="test.js"></script>
diff --git a/chrome/test/data/extensions/management/launch_app/manifest.json b/chrome/test/data/extensions/management/launch_app/manifest.json
new file mode 100644
index 0000000..a4813de
--- /dev/null
+++ b/chrome/test/data/extensions/management/launch_app/manifest.json
@@ -0,0 +1,6 @@
+{
+ "name": "Launch App test extension",
+ "version": "1",
+ "permissions": ["experimental"],
+ "background_page": "background.html"
+} \ No newline at end of file
diff --git a/chrome/test/data/extensions/management/launch_app/test.js b/chrome/test/data/extensions/management/launch_app/test.js
new file mode 100644
index 0000000..dad2be4
--- /dev/null
+++ b/chrome/test/data/extensions/management/launch_app/test.js
@@ -0,0 +1,30 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+if (!chrome.management) {
+ chrome.management = chrome.experimental.management;
+}
+
+window.onload = function() {
+ chrome.management.getAll(function(items) {
+ for (var i in items) {
+ var item = items[i];
+ if (item.name == "packaged_app") {
+ chrome.management.launchApp(item.id);
+ break;
+ }
+ if (item.name == "simple_extension") {
+ // Try launching a non-app extension, which should fail.
+ var expected_error = "Extension " + item.id + " is not an App";
+ chrome.management.launchApp(item.id, function() {
+ if (chrome.extension.lastError &&
+ chrome.extension.lastError.message == expected_error) {
+ chrome.test.sendMessage("got_expected_error");
+ }
+ });
+ }
+ }
+ });
+};
+
diff --git a/chrome/test/data/extensions/management/packaged_app/main.html b/chrome/test/data/extensions/management/packaged_app/main.html
new file mode 100644
index 0000000..1e23417
--- /dev/null
+++ b/chrome/test/data/extensions/management/packaged_app/main.html
@@ -0,0 +1,8 @@
+<html>
+<body>
+Hello World
+<script>
+chrome.test.sendMessage("app_launched");
+</script>
+</body>
+</html>
diff --git a/chrome/test/data/extensions/management/packaged_app/manifest.json b/chrome/test/data/extensions/management/packaged_app/manifest.json
new file mode 100644
index 0000000..08b94a6
--- /dev/null
+++ b/chrome/test/data/extensions/management/packaged_app/manifest.json
@@ -0,0 +1,9 @@
+{
+ "name": "packaged_app",
+ "version": "0.1",
+ "app": {
+ "launch": {
+ "local_path": "main.html"
+ }
+ }
+}
diff --git a/chrome/test/data/extensions/management/simple_extension/manifest.json b/chrome/test/data/extensions/management/simple_extension/manifest.json
new file mode 100644
index 0000000..99fe293
--- /dev/null
+++ b/chrome/test/data/extensions/management/simple_extension/manifest.json
@@ -0,0 +1,4 @@
+{
+ "name": "simple_extension",
+ "version": "1"
+}