diff options
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" +} |