summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortessamac@chromium.org <tessamac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-29 17:21:00 +0000
committertessamac@chromium.org <tessamac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-29 17:21:00 +0000
commit925a54d07ed877d29cadab06caa2e8e7e7dc7e2a (patch)
tree5ce1fb80acd4bcc2cc9eca1c47d2fd139b2c3cec
parent453e49922ff2c9b2a35b3952329bc43178e4e2c9 (diff)
downloadchromium_src-925a54d07ed877d29cadab06caa2e8e7e7dc7e2a.zip
chromium_src-925a54d07ed877d29cadab06caa2e8e7e7dc7e2a.tar.gz
chromium_src-925a54d07ed877d29cadab06caa2e8e7e7dc7e2a.tar.bz2
Add getPermissionWarnings() to management api.
BUG=74712 TEST=unit_tests, browser_tests, try bots Review URL: http://codereview.chromium.org/7230016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@94701 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/extension_function_dispatcher.cc2
-rw-r--r--chrome/browser/extensions/extension_management_api.cc164
-rw-r--r--chrome/browser/extensions/extension_management_api.h18
-rw-r--r--chrome/common/extensions/api/extension_api.json45
-rw-r--r--chrome/common/extensions/docs/management.html564
-rw-r--r--chrome/common/extensions/docs/permission_warnings.html14
-rw-r--r--chrome/common/extensions/docs/samples.json2
-rw-r--r--chrome/common/extensions/docs/static/management.html4
-rw-r--r--chrome/common/extensions/docs/static/permission_warnings.html7
-rw-r--r--chrome/common/extensions/extension_permission_set.cc1
-rw-r--r--chrome/common/extensions/extension_unittest.cc20
-rw-r--r--chrome/test/data/extensions/api_test/management/test/basics.js33
-rw-r--r--chrome/test/data/extensions/permissions/many-apis.json10
13 files changed, 881 insertions, 3 deletions
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc
index f90868a..b479f70 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.cc
+++ b/chrome/browser/extensions/extension_function_dispatcher.cc
@@ -306,6 +306,8 @@ void FactoryRegistry::ResetFunctions() {
// Management.
RegisterFunction<GetAllExtensionsFunction>();
RegisterFunction<GetExtensionByIdFunction>();
+ RegisterFunction<GetPermissionWarningsByIdFunction>();
+ RegisterFunction<GetPermissionWarningsByManifestFunction>();
RegisterFunction<LaunchAppFunction>();
RegisterFunction<SetEnabledFunction>();
RegisterFunction<UninstallFunction>();
diff --git a/chrome/browser/extensions/extension_management_api.cc b/chrome/browser/extensions/extension_management_api.cc
index c863855..f0f01c1 100644
--- a/chrome/browser/extensions/extension_management_api.cc
+++ b/chrome/browser/extensions/extension_management_api.cc
@@ -20,6 +20,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/webui/extension_icon_source.h"
#include "chrome/common/chrome_notification_types.h"
+#include "chrome/common/chrome_utility_messages.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/extensions/extension_error_utils.h"
@@ -47,7 +48,10 @@ const char kSizeKey[] = "size";
const char kUrlKey[] = "url";
const char kVersionKey[] = "version";
-const char kNoExtensionError[] = "No extension with id *";
+const char kExtensionCreateError[] =
+ "Failed to create extension from manifest.";
+const char kManifestParseError[] = "Failed to parse manifest.";
+const char kNoExtensionError[] = "Failed to find extension with id *";
const char kNotAnAppError[] = "Extension * is not an App";
const char kUserCantDisableError[] = "Extension * can not be disabled by user";
}
@@ -163,6 +167,164 @@ bool GetExtensionByIdFunction::RunImpl() {
return true;
}
+bool GetPermissionWarningsByIdFunction::RunImpl() {
+ std::string ext_id;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &ext_id));
+
+ const Extension* extension = service()->GetExtensionById(ext_id, true);
+ if (!extension) {
+ error_ = ExtensionErrorUtils::FormatErrorMessage(kNoExtensionError,
+ ext_id);
+ return false;
+ }
+
+ ExtensionPermissionMessages warnings = extension->GetPermissionMessages();
+ ListValue* result = new ListValue();
+ for (ExtensionPermissionMessages::const_iterator i = warnings.begin();
+ i < warnings.end(); ++i)
+ result->Append(Value::CreateStringValue(i->message()));
+ result_.reset(result);
+ return true;
+}
+
+namespace {
+
+// This class helps GetPermissionWarningsByManifestFunction manage
+// sending manifest JSON strings to the utility process for parsing.
+class SafeManifestJSONParser : public UtilityProcessHost::Client {
+ public:
+ SafeManifestJSONParser(GetPermissionWarningsByManifestFunction* client,
+ const std::string& manifest)
+ : client_(client),
+ manifest_(manifest) {}
+
+ void Start() {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ BrowserThread::PostTask(
+ BrowserThread::IO,
+ FROM_HERE,
+ NewRunnableMethod(this, &SafeManifestJSONParser::StartWorkOnIOThread));
+ }
+
+ void StartWorkOnIOThread() {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ utility_host_ = new UtilityProcessHost(this, BrowserThread::IO);
+ utility_host_->Send(new UtilityMsg_ParseJSON(manifest_));
+ }
+
+ virtual bool OnMessageReceived(const IPC::Message& message) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(SafeManifestJSONParser, message)
+ IPC_MESSAGE_HANDLER(UtilityHostMsg_ParseJSON_Succeeded,
+ OnJSONParseSucceeded)
+ IPC_MESSAGE_HANDLER(UtilityHostMsg_ParseJSON_Failed, OnJSONParseFailed)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+ }
+
+ void OnJSONParseSucceeded(const ListValue& wrapper) {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ Value* value = NULL;
+ CHECK(wrapper.Get(0, &value));
+ if (value->IsType(Value::TYPE_DICTIONARY))
+ parsed_manifest_.reset(static_cast<DictionaryValue*>(value)->DeepCopy());
+ else
+ error_ = kManifestParseError;
+
+ utility_host_ = NULL; // has already deleted itself
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ NewRunnableMethod(this,
+ &SafeManifestJSONParser::ReportResultFromUIThread));
+ }
+
+ void OnJSONParseFailed(const std::string& error) {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ error_ = error;
+ utility_host_ = NULL; // has already deleted itself
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ NewRunnableMethod(this,
+ &SafeManifestJSONParser::ReportResultFromUIThread));
+ }
+
+ void ReportResultFromUIThread() {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ if (error_.empty() && parsed_manifest_.get())
+ client_->OnParseSuccess(parsed_manifest_.release());
+ else
+ client_->OnParseFailure(error_);
+ }
+
+ private:
+ ~SafeManifestJSONParser() {}
+
+ // The client who we'll report results back to.
+ GetPermissionWarningsByManifestFunction* client_;
+
+ // Data to parse.
+ std::string manifest_;
+
+ // Results of parsing.
+ scoped_ptr<DictionaryValue> parsed_manifest_;
+
+ std::string error_;
+ UtilityProcessHost* utility_host_;
+};
+
+} // namespace
+
+bool GetPermissionWarningsByManifestFunction::RunImpl() {
+ std::string manifest_str;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &manifest_str));
+
+ scoped_refptr<SafeManifestJSONParser> parser =
+ new SafeManifestJSONParser(this, manifest_str);
+ parser->Start();
+
+ // Matched with a Release() in OnParseSuccess/Failure().
+ AddRef();
+
+ // Response is sent async in OnParseSuccess/Failure().
+ return true;
+}
+
+void GetPermissionWarningsByManifestFunction::OnParseSuccess(
+ DictionaryValue* parsed_manifest) {
+ CHECK(parsed_manifest);
+
+ scoped_refptr<Extension> extension = Extension::Create(
+ FilePath(), Extension::INVALID, *parsed_manifest,
+ Extension::STRICT_ERROR_CHECKS, &error_);
+ if (!extension.get()) {
+ OnParseFailure(kExtensionCreateError);
+ return;
+ }
+
+ ExtensionPermissionMessages warnings = extension->GetPermissionMessages();
+ ListValue* result = new ListValue();
+ for (ExtensionPermissionMessages::const_iterator i = warnings.begin();
+ i < warnings.end(); ++i)
+ result->Append(Value::CreateStringValue(i->message()));
+ result_.reset(result);
+ SendResponse(true);
+
+ // Matched with AddRef() in RunImpl().
+ Release();
+}
+
+void GetPermissionWarningsByManifestFunction::OnParseFailure(
+ const std::string& error) {
+ error_ = error;
+ SendResponse(false);
+
+ // Matched with AddRef() in RunImpl().
+ Release();
+}
+
bool LaunchAppFunction::RunImpl() {
std::string extension_id;
EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id));
diff --git a/chrome/browser/extensions/extension_management_api.h b/chrome/browser/extensions/extension_management_api.h
index 1096fc1..41bfc6f9 100644
--- a/chrome/browser/extensions/extension_management_api.h
+++ b/chrome/browser/extensions/extension_management_api.h
@@ -29,6 +29,24 @@ class GetExtensionByIdFunction : public ExtensionManagementFunction {
DECLARE_EXTENSION_FUNCTION_NAME("management.get");
};
+class GetPermissionWarningsByIdFunction : public ExtensionManagementFunction {
+ virtual ~GetPermissionWarningsByIdFunction() {}
+ virtual bool RunImpl();
+ DECLARE_EXTENSION_FUNCTION_NAME("management.getPermissionWarningsById");
+};
+
+class GetPermissionWarningsByManifestFunction : public AsyncExtensionFunction {
+ public:
+ // Called when utility process finishes.
+ void OnParseSuccess(base::DictionaryValue* parsed_manifest);
+ void OnParseFailure(const std::string& error);
+ protected:
+ virtual ~GetPermissionWarningsByManifestFunction() {}
+ virtual bool RunImpl();
+ DECLARE_EXTENSION_FUNCTION_NAME(
+ "management.getPermissionWarningsByManifest");
+};
+
class LaunchAppFunction : public ExtensionManagementFunction {
virtual ~LaunchAppFunction() {}
virtual bool RunImpl();
diff --git a/chrome/common/extensions/api/extension_api.json b/chrome/common/extensions/api/extension_api.json
index f23e363..a4fc793 100644
--- a/chrome/common/extensions/api/extension_api.json
+++ b/chrome/common/extensions/api/extension_api.json
@@ -5170,6 +5170,51 @@
]
},
{
+ "name": "getPermissionWarningsById",
+ "description": "Returns a list of <a href='permission_warnings.html'>permission warnings</a> for the given extension id.",
+ "parameters": [
+ { "name": "id",
+ "type": "string",
+ "description": "The ID of an already installed extension."
+ },
+ {
+ "name": "callback",
+ "type": "function",
+ "optional": "true",
+ "parameters": [
+ {
+ "name": "permissionWarnings",
+ "type": "array",
+ "items": { "type": "string" }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "getPermissionWarningsByManifest",
+ "description": "Returns a list of <a href='permission_warnings.html'>permission warnings</a> for the given extension manifest string. Note: This function can be used without requesting the 'management' permission in the manifest.",
+ "parameters": [
+ {
+ "name": "manifestStr",
+ "type": "string",
+ "description": "Extension manifest JSON string."
+ },
+ {
+ "name": "callback",
+ "type": "function",
+ "optional": "true",
+ "parameters": [
+ {
+ "name": "permissionWarnings",
+ "type": "array",
+ "items": { "type": "string" }
+ }
+ ]
+ }
+ ]
+ },
+ {
"name": "setEnabled",
"description": "Enable or disable an app or extension.",
"parameters": [
diff --git a/chrome/common/extensions/docs/management.html b/chrome/common/extensions/docs/management.html
index e140ed4..6bbd852 100644
--- a/chrome/common/extensions/docs/management.html
+++ b/chrome/common/extensions/docs/management.html
@@ -284,6 +284,10 @@
</li><li>
<a href="#method-getAll">getAll</a>
</li><li>
+ <a href="#method-getPermissionWarningsById">getPermissionWarningsById</a>
+ </li><li>
+ <a href="#method-getPermissionWarningsByManifest">getPermissionWarningsByManifest</a>
+ </li><li>
<a href="#method-launchApp">launchApp</a>
</li><li>
<a href="#method-setEnabled">setEnabled</a>
@@ -350,6 +354,10 @@ For example:</p>
...
}</pre>
+<p>
+The one method that doesn't require the "manifest" permission is
+<a href="#method-getPermissionWarningsByManifest"><code>getPermissionWarningsByManifest</code></a>
+</p>
<!-- END AUTHORED CONTENT -->
</div>
@@ -859,6 +867,562 @@ For example:</p>
</div> <!-- /description -->
</div><div class="apiItem">
+ <a name="method-getPermissionWarningsById"></a> <!-- method-anchor -->
+ <h4>getPermissionWarningsById</h4>
+
+ <div class="summary"><span style="display: none; ">void</span>
+ <!-- Note: intentionally longer 80 columns -->
+ <span>chrome.management.getPermissionWarningsById</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>Returns a list of <a href="permission_warnings.html">permission warnings</a> for the given extension id.</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 ID of an already installed extension.</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>
+
+ <!-- OBJECT METHODS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- OBJECT EVENT FIELDS -->
+ <dd style="display: none; ">
+ <div></div>
+ </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>
+
+ <!-- OBJECT METHODS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- OBJECT EVENT FIELDS -->
+ <dd style="display: none; ">
+ <div></div>
+ </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>array of string permissionWarnings</span>) <span class="subdued">{...}</span>;</pre>
+ <dl>
+ <div>
+ <div>
+ <dt>
+ <var>permissionWarnings</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>
+ array of <span><span>
+ <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></span>
+ </span>
+ <span style="display: none; ">paramType</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>
+
+ <!-- OBJECT METHODS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- OBJECT EVENT FIELDS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- FUNCTION PARAMETERS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ </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-getPermissionWarningsByManifest"></a> <!-- method-anchor -->
+ <h4>getPermissionWarningsByManifest</h4>
+
+ <div class="summary"><span style="display: none; ">void</span>
+ <!-- Note: intentionally longer 80 columns -->
+ <span>chrome.management.getPermissionWarningsByManifest</span>(<span class="null"><span style="display: none; ">, </span><span>string</span>
+ <var><span>manifestStr</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>Returns a list of <a href="permission_warnings.html">permission warnings</a> for the given extension manifest string. Note: This function can be used without requesting the 'management' permission in the manifest.</p>
+
+ <!-- PARAMETERS -->
+ <h4>Parameters</h4>
+ <dl>
+ <div>
+ <div>
+ <dt>
+ <var>manifestStr</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>Extension manifest JSON string.</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>
+
+ <!-- OBJECT METHODS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- OBJECT EVENT FIELDS -->
+ <dd style="display: none; ">
+ <div></div>
+ </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>
+
+ <!-- OBJECT METHODS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- OBJECT EVENT FIELDS -->
+ <dd style="display: none; ">
+ <div></div>
+ </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>array of string permissionWarnings</span>) <span class="subdued">{...}</span>;</pre>
+ <dl>
+ <div>
+ <div>
+ <dt>
+ <var>permissionWarnings</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>
+ array of <span><span>
+ <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></span>
+ </span>
+ <span style="display: none; ">paramType</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>
+
+ <!-- OBJECT METHODS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- OBJECT EVENT FIELDS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- FUNCTION PARAMETERS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ </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-launchApp"></a> <!-- method-anchor -->
<h4>launchApp</h4>
diff --git a/chrome/common/extensions/docs/permission_warnings.html b/chrome/common/extensions/docs/permission_warnings.html
index 0daff91..6620713 100644
--- a/chrome/common/extensions/docs/permission_warnings.html
+++ b/chrome/common/extensions/docs/permission_warnings.html
@@ -285,6 +285,13 @@
<a>h3Name</a>
</li>
</ol>
+ </li><li>
+ <a href="#api">API</a>
+ <ol>
+ <li style="display: none; ">
+ <a>h3Name</a>
+ </li>
+ </ol>
</li>
<li style="display: none; ">
<a href="#apiReference">API reference</a>
@@ -702,6 +709,13 @@ Finally, update the extension
by clicking the <b>chrome://extensions</b> page's
<b>Update extensions now</b> button.
</p>
+
+<h2 id="api">API</h2>
+
+<p>
+You can get a list of permission warnings for any manifest with
+<a href="management.html#method-getPermissionWarnings">chrome.management.getPermissionWarnings()</a>.
+</p>
</div>
<!-- API PAGE -->
diff --git a/chrome/common/extensions/docs/samples.json b/chrome/common/extensions/docs/samples.json
index 0addcc1..32c398b 100644
--- a/chrome/common/extensions/docs/samples.json
+++ b/chrome/common/extensions/docs/samples.json
@@ -114,6 +114,8 @@
"chrome.idle.queryState": "idle.html#method-queryState",
"chrome.management.get": "management.html#method-get",
"chrome.management.getAll": "management.html#method-getAll",
+ "chrome.management.getPermissionWarningsById": "management.html#method-getPermissionWarningsById",
+ "chrome.management.getPermissionWarningsByManifest": "management.html#method-getPermissionWarningsByManifest",
"chrome.management.launchApp": "management.html#method-launchApp",
"chrome.management.onDisabled": "management.html#event-onDisabled",
"chrome.management.onEnabled": "management.html#event-onEnabled",
diff --git a/chrome/common/extensions/docs/static/management.html b/chrome/common/extensions/docs/static/management.html
index f9ee486..891f33c 100644
--- a/chrome/common/extensions/docs/static/management.html
+++ b/chrome/common/extensions/docs/static/management.html
@@ -20,4 +20,8 @@ For example:</p>
...
}</pre>
+<p>
+The one method that doesn't require the "manifest" permission is
+<a href="#method-getPermissionWarningsByManifest"><code>getPermissionWarningsByManifest</code></a>
+</p>
<!-- END AUTHORED CONTENT -->
diff --git a/chrome/common/extensions/docs/static/permission_warnings.html b/chrome/common/extensions/docs/static/permission_warnings.html
index b215b4f..93a8db2 100644
--- a/chrome/common/extensions/docs/static/permission_warnings.html
+++ b/chrome/common/extensions/docs/static/permission_warnings.html
@@ -378,3 +378,10 @@ Finally, update the extension
by clicking the <b>chrome://extensions</b> page's
<b>Update extensions now</b> button.
</p>
+
+<h2 id="api">API</h2>
+
+<p>
+You can get a list of permission warnings for any manifest with
+<a href="management.html#method-getPermissionWarnings">chrome.management.getPermissionWarnings()</a>.
+</p>
diff --git a/chrome/common/extensions/extension_permission_set.cc b/chrome/common/extensions/extension_permission_set.cc
index ba7a7d3..7568c85 100644
--- a/chrome/common/extensions/extension_permission_set.cc
+++ b/chrome/common/extensions/extension_permission_set.cc
@@ -68,6 +68,7 @@ const size_t kNumNonPermissionModuleNames =
// without asking for the module permission. In other words, functions you can
// use with no permissions specified.
const char* kNonPermissionFunctionNames[] = {
+ "management.getPermissionWarningsByManifest",
"tabs.create",
"tabs.onRemoved",
"tabs.remove",
diff --git a/chrome/common/extensions/extension_unittest.cc b/chrome/common/extensions/extension_unittest.cc
index 5115573..d64dfee 100644
--- a/chrome/common/extensions/extension_unittest.cc
+++ b/chrome/common/extensions/extension_unittest.cc
@@ -534,6 +534,9 @@ TEST(ExtensionTest, ApiPermissions) {
{ "tabs.remove", true},
{ "tabs.update", true},
{ "tabs.getSelected", false},
+ // Test getPermissionWarnings functions. Only one requires permissions.
+ { "management.getPermissionWarningsById", false },
+ { "management.getPermissionWarningsByManifest", true },
};
scoped_refptr<Extension> extension;
@@ -546,7 +549,22 @@ TEST(ExtensionTest, ApiPermissions) {
}
}
-TEST(ExtensionTest, GetHostPermissionMessages_ManyHosts) {
+TEST(ExtensionTest, GetPermissionMessages_ManyApiPermissions) {
+ scoped_refptr<Extension> extension;
+ extension = LoadManifest("permissions", "many-apis.json");
+ std::vector<string16> warnings = extension->GetPermissionMessageStrings();
+ ASSERT_EQ(6u, warnings.size());
+ EXPECT_EQ("Your data on api.flickr.com",
+ UTF16ToUTF8(warnings[0]));
+ EXPECT_EQ("Your bookmarks", UTF16ToUTF8(warnings[1]));
+ EXPECT_EQ("Your physical location", UTF16ToUTF8(warnings[2]));
+ EXPECT_EQ("Your browsing history", UTF16ToUTF8(warnings[3]));
+ EXPECT_EQ("Your tabs and browsing activity", UTF16ToUTF8(warnings[4]));
+ EXPECT_EQ("Your list of installed apps, extensions, and themes",
+ UTF16ToUTF8(warnings[5]));
+}
+
+TEST(ExtensionTest, GetPermissionMessages_ManyHosts) {
scoped_refptr<Extension> extension;
extension = LoadManifest("permissions", "many-hosts.json");
std::vector<string16> warnings = extension->GetPermissionMessageStrings();
diff --git a/chrome/test/data/extensions/api_test/management/test/basics.js b/chrome/test/data/extensions/api_test/management/test/basics.js
index b921ee0..a55e9d7 100644
--- a/chrome/test/data/extensions/api_test/management/test/basics.js
+++ b/chrome/test/data/extensions/api_test/management/test/basics.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 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.
@@ -82,6 +82,37 @@ var tests = [
}));
},
+ function permissionWarnings() {
+ var manifest_str = "{ \"name\": \"Hello World!\", \"version\": \"1.0\", " +
+ "\"permissions\": [\"http://api.flickr.com/\", " +
+ "\"bookmarks\", \"geolocation\", " +
+ "\"history\", \"tabs\"]," +
+ "\"content_scripts\": [{\"js\": [\"script.js\"], " +
+ "\"matches\": [\"http://*.flickr.com/*\"]}]}";
+
+ chrome.management.getPermissionWarningsByManifest(
+ manifest_str, callback(function(warnings) {
+ chrome.test.assertEq(5, warnings.length);
+ chrome.test.assertEq("Your data on *.flickr.com and api.flickr.com",
+ warnings[0]);
+ chrome.test.assertEq("Your bookmarks", warnings[1]);
+ chrome.test.assertEq("Your physical location", warnings[2]);
+ chrome.test.assertEq("Your browsing history", warnings[3]);
+ chrome.test.assertEq("Your tabs and browsing activity", warnings[4]);
+ }));
+
+ chrome.management.getAll(callback(function(items) {
+ var extension = getItemNamed(items, "Extension Management API Test");
+ chrome.management.getPermissionWarningsById(extension.id,
+ callback(function(warnings) {
+ chrome.test.assertEq(1, warnings.length);
+ chrome.test.assertEq("Your list of installed apps, extensions, " +
+ "and themes",
+ warnings[0]);
+ }));
+ }));
+ },
+
// Disables an enabled app.
function disable() {
listenOnce(chrome.management.onDisabled, function(info) {
diff --git a/chrome/test/data/extensions/permissions/many-apis.json b/chrome/test/data/extensions/permissions/many-apis.json
new file mode 100644
index 0000000..d59c616
--- /dev/null
+++ b/chrome/test/data/extensions/permissions/many-apis.json
@@ -0,0 +1,10 @@
+{
+ "name": "Permission Warnings!!",
+ "version": "1.0",
+ "permissions": ["http://api.flickr.com/",
+ "bookmarks",
+ "geolocation",
+ "history",
+ "management",
+ "tabs"]
+}