Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(210)

Side by Side Diff: chrome/test/data/extensions/api_test/permissions/host_subsets/background.js

Issue 12209094: Support requesting subsets of host permissions using the permissions API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 var ERROR = 'Optional permissions must be listed in extension manifest.';
6 var test = chrome.test;
7
8 // The URL patterns that we've supposedly been granted access to so far. Use
9 // this to verify queried hosts for each test.
10 var grantedHosts = [];
11
12 // Pushes a value onto an array, asserting that it's unique in the array.
13 function pushUniqueValue(array, value) {
14 test.assertEq(-1, array.indexOf(value));
15 array.push(value);
16 }
17
18 // Removes a value from an array, asserting that it's unique in the array.
19 function removeUniqueValue(array, value) {
20 var indexOfValue = array.indexOf(value);
21 test.assertTrue(indexOfValue >= 0);
22 array.splice(indexOfValue, 1);
23 test.assertEq(-1, array.indexOf(value));
24 }
25
26 // Asserts that two arrays are equal when treated as sets.
27 function assertSetEq(expected, actual) {
28 if (!actual)
29 actual = [];
30 test.assertEq(expected.slice().sort(), actual.slice().sort());
31 }
32
33 // Validates that the origin permissions returned from getAll() and contains()
34 // match |grantedHosts|.
35 function checkGrantedHosts(callback) {
36 chrome.permissions.getAll(test.callbackPass(function(permissions) {
37 assertSetEq(grantedHosts, permissions.origins);
38 var countDown = grantedHosts.length;
39 if (countDown == 0) {
40 callback();
41 return;
42 }
43 grantedHosts.forEach(function(host) {
44 chrome.permissions.contains({origins: [host]},
45 test.callbackPass(function(contains) {
46 test.assertTrue(contains);
47 if (--countDown == 0)
48 callback();
49 }));
50 });
51 }));
52 }
53
54 // Returns a function which requests access to a host, and afterwards checks
55 // that our expected host permissions agree with Chrome's.
56 function requestHost(host, expectedGranted, expectedError) {
57 return function(callback) {
58 chrome.permissions.request({origins: [host]},
59 test.callback(function(granted) {
60 if (granted)
61 pushUniqueValue(grantedHosts, host);
62 if (expectedGranted) {
63 test.assertTrue(
64 granted,
65 "Access to " + host + " was not granted, but should have been");
66 } else {
67 test.assertFalse(
68 granted,
69 "Access to " + host + " was granted, but should not have been");
70 }
71 checkGrantedHosts(callback);
72 }, expectedError));
73 };
74 }
75
76 // Returns a function which removes access to a host, and afterwards checks
77 // that our expected host permissions agree with Chrome's.
78 function removeHost(host, expectedRemoved) {
79 return function(callback) {
80 chrome.permissions.remove({origins: [host]},
81 test.callbackPass(function(removed) {
82 if (removed) {
83 test.assertTrue(expectedRemoved, "Access to " + host + " removed");
84 removeUniqueValue(grantedHosts, host);
85 } else {
86 test.assertFalse(expectedRemoved, "Access to " + host + " not removed");
87 }
88 checkGrantedHosts(callback);
89 }));
90 }
91 }
92
93 // Returns a function which checks that permissions.contains(host) returns
94 // |expected|.
95 function contains(host, expected) {
96 return function(callback) {
97 chrome.permissions.contains({origins: [host]},
98 test.callbackPass(function(result) {
99 test.assertEq(expected, result);
100 callback();
101 }));
102 };
103 }
104
105 // Calls every function in |chain| passing each the next function to run as a
106 // single argument - except for the last function, which is *not* expected to
107 // have a callback.
108 //
109 // The test is kept alive until all callbacks in the chain have been run.
110 function chain(callbacks) {
111 var head = callbacks[0], tail = callbacks.slice(1);
112 if (tail.length == 0) {
113 head();
114 return;
115 }
116 var callbackCompleted = chrome.test.callbackAdded();
117 head(function() {
118 try {
119 chain(tail);
120 } finally {
121 callbackCompleted();
122 }
123 });
124 }
125
126 function main() {
127 chain([
128 // Simple request #1.
129 contains('http://google.com/*', false),
130 requestHost('http://google.com/*', true),
131 contains('http://google.com/*', true),
132 contains('http://google.com/foo/*', true),
133 contains('http://google.com:1234/foo/*', true),
134 contains('http://www.google.com/*', false),
135
136 // Simple request #2.
137 requestHost('http://*.yahoo.com/*', true),
138 contains('http://yahoo.com/*', true),
139 contains('http://yahoo.com/foo/*', true),
140 contains('http://www.yahoo.com/*', true),
141 contains('http://www.yahoo.com/foo/*', true),
142 contains('http://www.yahoo.com:5678/foo/*', true),
143
144 // Can request access to a subset of a host that's allowed.
145 requestHost('http://yahoo.com/*', true),
146
147 // Can remove it.
148 removeHost('http://yahoo.com/*', true),
149
150 // However, since it's still granted by the *.yahoo.com/*
151 // permission, it's still considered to contain it.
152 contains('http://yahoo.com/*', true),
153
154 // Can remove the whole host, though.
155 removeHost('http://*.yahoo.com/*', true),
156 contains('http://google.com/*', true),
157 contains('http://yahoo.com/*', false),
158 contains('http://www.yahoo.com/*', false),
159
160 // Widening the net (and then deleting it).
161 requestHost('http://*.google.com/*', true),
162 contains('http://google.com/*', true),
163 contains('http://www.google.com/*', true),
164 removeHost('http://google.com/*', true),
165 contains('http://google.com/*', true),
166 contains('http://www.google.com/*', true),
167 removeHost('http://*.google.com/*', true),
168 contains('http://google.com/*', false),
169 contains('http://www.google.com/*', false),
170
171 // https schemes should fail because they're not covered by
172 // this extension's optional permission pattern.
173 requestHost('https://google.com/*', false, ERROR),
174 requestHost('https://*.yahoo.com/*', false, ERROR),
175
176 // There is a sneaky ftp://ftp.example.com/* pattern in the
177 // manifest. Test it.
178 requestHost('ftp://example.com/*', false, ERROR),
179 contains('ftp://example.com/*', false),
180 requestHost('ftp://www.example.com/*', false, ERROR),
181 contains('ftp://www.example.com/*', false),
182 requestHost('ftp://secret.ftp.example.com/*', false, ERROR),
183 contains('ftp://secret.ftp.example.com/*', false),
184 requestHost('ftp://ftp.example.com/*', true),
185 contains('ftp://ftp.example.com/*', true),
186 removeHost('ftp://ftp.example.com/*', true),
187 contains('ftp://ftp.example.com/*', false),
188
189 // And finally...
190 test.succeed]);
191 }
192
193 test.runTests([main]);
Yoyo Zhou 2013/02/12 06:46:25 Not super important, but this doesn't have to be a
not at google - send to devlin 2013/02/12 17:06:43 True, but that'd mess up the beautiful chain of co
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698