Skip to content

Commit

Permalink
Move extension permissions API out of experimental.
Browse files Browse the repository at this point in the history
BUG=84507
TEST=*Extension*

Review URL: http://codereview.chromium.org/8277004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@105491 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
jstritar@chromium.org committed Oct 14, 2011
1 parent a690bb0 commit fdacba3
Show file tree
Hide file tree
Showing 101 changed files with 232 additions and 120 deletions.
4 changes: 2 additions & 2 deletions chrome/browser/extensions/extension_permissions_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ const char kUserGestureRequiredError[] =
const char kInvalidOrigin[] =
"Invalid value for origin pattern *: *";

const char kOnAdded[] = "experimental.permissions.onAdded";
const char kOnRemoved[] = "experimental.permissions.onRemoved";
const char kOnAdded[] = "permissions.onAdded";
const char kOnRemoved[] = "permissions.onRemoved";

enum AutoConfirmForTest {
DO_NOT_SKIP = 0,
Expand Down
8 changes: 4 additions & 4 deletions chrome/browser/extensions/extension_permissions_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,21 +66,21 @@ class ExtensionPermissionsManager {
class ContainsPermissionsFunction : public SyncExtensionFunction {
virtual ~ContainsPermissionsFunction() {}
virtual bool RunImpl() OVERRIDE;
DECLARE_EXTENSION_FUNCTION_NAME("experimental.permissions.contains")
DECLARE_EXTENSION_FUNCTION_NAME("permissions.contains")
};

// chrome.permissions.getAll
class GetAllPermissionsFunction : public SyncExtensionFunction {
virtual ~GetAllPermissionsFunction() {}
virtual bool RunImpl() OVERRIDE;
DECLARE_EXTENSION_FUNCTION_NAME("experimental.permissions.getAll")
DECLARE_EXTENSION_FUNCTION_NAME("permissions.getAll")
};

// chrome.permissions.remove
class RemovePermissionsFunction : public SyncExtensionFunction {
virtual ~RemovePermissionsFunction() {}
virtual bool RunImpl() OVERRIDE;
DECLARE_EXTENSION_FUNCTION_NAME("experimental.permissions.remove")
DECLARE_EXTENSION_FUNCTION_NAME("permissions.remove")
};

// chrome.permissions.request
Expand All @@ -105,7 +105,7 @@ class RequestPermissionsFunction : public AsyncExtensionFunction,
scoped_ptr<ExtensionInstallUI> install_ui_;
scoped_refptr<ExtensionPermissionSet> requested_permissions_;
const Extension* extension_;
DECLARE_EXTENSION_FUNCTION_NAME("experimental.permissions.request")
DECLARE_EXTENSION_FUNCTION_NAME("permissions.request")
};

#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_PERMISSIONS_API_H__
8 changes: 4 additions & 4 deletions chrome/browser/extensions/permissions_apitest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, AlwaysAllowed) {
}

// Tests that the optional permissions API works correctly.
IN_PROC_BROWSER_TEST_F(ExperimentalApiTest, OptionalPermissionsGranted) {
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, OptionalPermissionsGranted) {
// Mark all the tested APIs as granted to bypass the confirmation UI.
ExtensionAPIPermissionSet apis;
apis.insert(ExtensionAPIPermission::kTab);
Expand All @@ -87,7 +87,7 @@ IN_PROC_BROWSER_TEST_F(ExperimentalApiTest, OptionalPermissionsGranted) {
}

// Tests that the optional permissions API works correctly.
IN_PROC_BROWSER_TEST_F(ExperimentalApiTest, OptionalPermissionsAutoConfirm) {
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, OptionalPermissionsAutoConfirm) {
// Rather than setting the granted permissions, set the UI autoconfirm flag
// and run the same tests.
RequestPermissionsFunction::SetAutoConfirmForTests(true);
Expand All @@ -98,7 +98,7 @@ IN_PROC_BROWSER_TEST_F(ExperimentalApiTest, OptionalPermissionsAutoConfirm) {
}

// Test that denying the optional permissions confirmation dialog works.
IN_PROC_BROWSER_TEST_F(ExperimentalApiTest, OptionalPermissionsDeny) {
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, OptionalPermissionsDeny) {
RequestPermissionsFunction::SetAutoConfirmForTests(false);
RequestPermissionsFunction::SetIgnoreUserGestureForTests(true);
host_resolver()->AddRule("*.com", "127.0.0.1");
Expand All @@ -108,7 +108,7 @@ IN_PROC_BROWSER_TEST_F(ExperimentalApiTest, OptionalPermissionsDeny) {

// Tests that the permissions.request function must be called from within a
// user gesture.
IN_PROC_BROWSER_TEST_F(ExperimentalApiTest, OptionalPermissionsGesture) {
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, OptionalPermissionsGesture) {
RequestPermissionsFunction::SetIgnoreUserGestureForTests(false);
host_resolver()->AddRule("*.com", "127.0.0.1");
ASSERT_TRUE(StartTestServer());
Expand Down
2 changes: 1 addition & 1 deletion chrome/common/extensions/api/extension_api.json
Original file line number Diff line number Diff line change
Expand Up @@ -1343,7 +1343,7 @@
]
},
{
"namespace": "experimental.permissions",
"namespace": "permissions",
"types": [
{
"id": "Permissions",
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/a11y.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
3 changes: 2 additions & 1 deletion chrome/common/extensions/docs/api_index.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down Expand Up @@ -341,7 +342,7 @@ <h2 id="supported">Supported APIs</h2>
</p>

<ul>
<li><a href="bookmarks.html" js="">bookmarks</a></li><li><a href="browserAction.html" js="">browserAction</a></li><li><a href="contentSettings.html" js="">contentSettings</a></li><li><a href="contextMenus.html" js="">contextMenus</a></li><li><a href="cookies.html" js="">cookies</a></li><li><a href="extension.html" js="">extension</a></li><li><a href="fileBrowserHandler.html" js="">fileBrowserHandler</a></li><li><a href="history.html" js="">history</a></li><li><a href="i18n.html" js="">i18n</a></li><li><a href="idle.html" js="">idle</a></li><li><a href="management.html" js="">management</a></li><li><a href="omnibox.html" js="">omnibox</a></li><li><a href="pageAction.html" js="">pageAction</a></li><li><a href="proxy.html" js="">proxy</a></li><li><a href="tabs.html" js="">tabs</a></li><li><a href="tts.html" js="">tts</a></li><li><a href="ttsEngine.html" js="">ttsEngine</a></li><li><a href="types.html" js="">types</a></li><li><a href="webNavigation.html" js="">webNavigation</a></li><li><a href="windows.html" js="">windows</a></li>
<li><a href="bookmarks.html" js="">bookmarks</a></li><li><a href="browserAction.html" js="">browserAction</a></li><li><a href="contentSettings.html" js="">contentSettings</a></li><li><a href="contextMenus.html" js="">contextMenus</a></li><li><a href="cookies.html" js="">cookies</a></li><li><a href="extension.html" js="">extension</a></li><li><a href="fileBrowserHandler.html" js="">fileBrowserHandler</a></li><li><a href="history.html" js="">history</a></li><li><a href="i18n.html" js="">i18n</a></li><li><a href="idle.html" js="">idle</a></li><li><a href="management.html" js="">management</a></li><li><a href="omnibox.html" js="">omnibox</a></li><li><a href="pageAction.html" js="">pageAction</a></li><li><a href="permissions.html" js="">permissions</a></li><li><a href="proxy.html" js="">proxy</a></li><li><a href="tabs.html" js="">tabs</a></li><li><a href="tts.html" js="">tts</a></li><li><a href="ttsEngine.html" js="">ttsEngine</a></li><li><a href="types.html" js="">types</a></li><li><a href="webNavigation.html" js="">webNavigation</a></li><li><a href="windows.html" js="">windows</a></li>
</ul>

<h2 id="experimental">Experimental APIs</h2>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/api_other.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/apps.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/autoupdate.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/background_pages.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/bookmarks.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/browserAction.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/contentSettings.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/content_scripts.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/contextMenus.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/cookies.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/crx.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
6 changes: 5 additions & 1 deletion chrome/common/extensions/docs/devguide.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down Expand Up @@ -420,6 +421,10 @@ <h2>Contents</h2>
<td> Communicate from a content script to its parent extension,
or vice versa</td>
</tr>
<tr>
<td> <a href="permissions.html">Optional Permissions</a> </td>
<td> Modify your extension's permissions </td>
</tr>
<tr>
<td> <a href="npapi.html">NPAPI&nbsp;Plugins</a> </td>
<td> Load native binary code </td>
Expand Down Expand Up @@ -448,7 +453,6 @@ <h2>Contents</h2>
<td> Create a <code>.crx</code> file so you can distribute your extension </td>
</tr>
</tbody></table>

</div>

<!-- API PAGE -->
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/docs.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/events.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,22 @@ var YES = 'ENABLED';
var NO = 'DISABLED';

var $status = document.querySelector('#status');
chrome.experimental.permissions.onAdded.addListener(function(permissions) {
chrome.permissions.onAdded.addListener(function(permissions) {
$status.innerText = YES;
});
chrome.experimental.permissions.onRemoved.addListener(function(permissions) {
chrome.permissions.onRemoved.addListener(function(permissions) {
$status.innerText = NO;
});
chrome.experimental.permissions.contains(PERMISSIONS, function(contains) {
chrome.permissions.contains(PERMISSIONS, function(contains) {
$status.innerText = contains ? YES : NO;
});

document.querySelector('button#enable').addEventListener('click', function() {
chrome.experimental.permissions.contains(PERMISSIONS, function(allowed) {
chrome.permissions.contains(PERMISSIONS, function(allowed) {
if (allowed) {
alert('You already have SO host permission!');
} else {
chrome.experimental.permissions.request(PERMISSIONS, function(result) {
chrome.permissions.request(PERMISSIONS, function(result) {
if (result) {
console.log('SO host permission granted!' +
'Open the browser action again.');
Expand All @@ -33,9 +33,9 @@ document.querySelector('button#enable').addEventListener('click', function() {
});

document.querySelector('button#disable').addEventListener('click', function() {
chrome.experimental.permissions.contains(PERMISSIONS, function(allowed) {
chrome.permissions.contains(PERMISSIONS, function(allowed) {
if (allowed) {
chrome.experimental.permissions.remove(PERMISSIONS, function(result) {
chrome.permissions.remove(PERMISSIONS, function(result) {
console.log('Revoked SO host permission.');
});
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ var PERMISSIONS = {origins: ['http://api.stackoverflow.com/']};
var URL = 'http://api.stackoverflow.com/1.1/questions?max=10&sort=votes&tagged=google-chrome-extension';
var ROOT = 'http://stackoverflow.com';

chrome.experimental.permissions.contains(PERMISSIONS, function(result) {
chrome.permissions.contains(PERMISSIONS, function(result) {
if (!result) {
// Open options page to request permissions.
document.querySelector('#title').innerText =
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/experimental.app.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/experimental.clear.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/experimental.cookies.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
1 change: 1 addition & 0 deletions chrome/common/extensions/docs/experimental.debugger.html
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="i18n.html">Internationalization</a></li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="permissions.html">Optional Permissions</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
Expand Down
Loading

0 comments on commit fdacba3

Please sign in to comment.