diff options
author | tessamac@chromium.org <tessamac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-29 17:21:00 +0000 |
---|---|---|
committer | tessamac@chromium.org <tessamac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-29 17:21:00 +0000 |
commit | 925a54d07ed877d29cadab06caa2e8e7e7dc7e2a (patch) | |
tree | 5ce1fb80acd4bcc2cc9eca1c47d2fd139b2c3cec | |
parent | 453e49922ff2c9b2a35b3952329bc43178e4e2c9 (diff) | |
download | chromium_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
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"] +} |