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

Side by Side Diff: Source/devtools/front_end/sdk/RemoteObject.js

Issue 1325783003: [DevTools] Added RemoteArray and RemoteFunction wrappers (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 3 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
« no previous file with comments | « Source/devtools/front_end/platform/utilities.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 10 matching lines...) Expand all
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 /**
32 * @typedef {{object: ?WebInspector.RemoteObject, wasThrown: (boolean|undefined) }}
33 */
34 WebInspector.CallFunctionResult;
35
31 /** 36 /**
32 * This may not be an interface due to "instanceof WebInspector.RemoteObject" ch ecks in the code. 37 * This may not be an interface due to "instanceof WebInspector.RemoteObject" ch ecks in the code.
33 * 38 *
34 * @constructor 39 * @constructor
35 */ 40 */
36 WebInspector.RemoteObject = function() { } 41 WebInspector.RemoteObject = function() { }
37 42
38 WebInspector.RemoteObject.prototype = { 43 WebInspector.RemoteObject.prototype = {
39 44
40 /** 45 /**
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 * @param {!RuntimeAgent.CallArgument} name 172 * @param {!RuntimeAgent.CallArgument} name
168 * @param {function(string=)} callback 173 * @param {function(string=)} callback
169 */ 174 */
170 deleteProperty: function(name, callback) 175 deleteProperty: function(name, callback)
171 { 176 {
172 throw "Not implemented"; 177 throw "Not implemented";
173 }, 178 },
174 179
175 /** 180 /**
176 * @param {function(this:Object, ...)} functionDeclaration 181 * @param {function(this:Object, ...)} functionDeclaration
177 * @param {!Array.<!RuntimeAgent.CallArgument>=} args 182 * @param {!Array<!RuntimeAgent.CallArgument>=} args
178 * @param {function(?WebInspector.RemoteObject, boolean=)=} callback 183 * @param {function(?WebInspector.RemoteObject, boolean=)=} callback
179 */ 184 */
180 callFunction: function(functionDeclaration, args, callback) 185 callFunction: function(functionDeclaration, args, callback)
181 { 186 {
182 throw "Not implemented"; 187 throw "Not implemented";
183 }, 188 },
184 189
185 /** 190 /**
186 * @param {function(this:Object, ...)} functionDeclaration 191 * @param {function(this:Object, ...)} functionDeclaration
187 * @param {!Array.<!RuntimeAgent.CallArgument>=} args 192 * @param {!Array<!RuntimeAgent.CallArgument>=} args
188 * @return {!Promise.<!{object: ?WebInspector.RemoteObject, wasThrown: (bool ean|undefined)}>} 193 * @return {!Promise<!WebInspector.CallFunctionResult>}
189 */ 194 */
190 callFunctionPromise: function(functionDeclaration, args) 195 callFunctionPromise: function(functionDeclaration, args)
191 { 196 {
192 return new Promise(promiseConstructor.bind(this)); 197 return new Promise(promiseConstructor.bind(this));
193 198
194 /** 199 /**
195 * @param {function(!{object: ?WebInspector.RemoteObject, wasThrown: (bo olean|undefined)})} success 200 * @param {function(!WebInspector.CallFunctionResult)} success
196 * @this {WebInspector.RemoteObject} 201 * @this {WebInspector.RemoteObject}
197 */ 202 */
198 function promiseConstructor(success) 203 function promiseConstructor(success)
199 { 204 {
200 this.callFunction(functionDeclaration, args, callFunctionCallback.bi nd(null, success)); 205 this.callFunction(functionDeclaration, args, callFunctionCallback.bi nd(null, success));
201 } 206 }
202 207
203 /** 208 /**
204 * @param {function(!{object: ?WebInspector.RemoteObject, wasThrown: (bo olean|undefined)})} callback 209 * @param {function(!WebInspector.CallFunctionResult)} callback
205 * @param {?WebInspector.RemoteObject} object 210 * @param {?WebInspector.RemoteObject} object
206 * @param {boolean=} wasThrown 211 * @param {boolean=} wasThrown
207 */ 212 */
208 function callFunctionCallback(callback, object, wasThrown) 213 function callFunctionCallback(callback, object, wasThrown)
209 { 214 {
210 callback({ 215 callback({
211 object: object, 216 object: object,
212 wasThrown: wasThrown 217 wasThrown: wasThrown
213 }); 218 });
214 } 219 }
215 }, 220 },
216 221
217 /** 222 /**
218 * @param {function(this:Object)} functionDeclaration 223 * @param {function(this:Object, ...)} functionDeclaration
219 * @param {!Array<!RuntimeAgent.CallArgument>|undefined} args 224 * @param {!Array<!RuntimeAgent.CallArgument>|undefined} args
220 * @param {function(*)} callback 225 * @param {function(*)} callback
221 */ 226 */
222 callFunctionJSON: function(functionDeclaration, args, callback) 227 callFunctionJSON: function(functionDeclaration, args, callback)
223 { 228 {
224 throw "Not implemented"; 229 throw "Not implemented";
225 }, 230 },
226 231
227 /** 232 /**
228 * @param {function(this:Object)} functionDeclaration 233 * @param {function(this:Object, ...)} functionDeclaration
229 * @param {!Array<!RuntimeAgent.CallArgument>|undefined} args 234 * @param {!Array<!RuntimeAgent.CallArgument>|undefined} args
230 * @return {!Promise<*>} 235 * @return {!Promise<*>}
231 */ 236 */
232 callFunctionJSONPromise: function(functionDeclaration, args) 237 callFunctionJSONPromise: function(functionDeclaration, args)
233 { 238 {
234 return new Promise(promiseConstructor.bind(this)); 239 return new Promise(promiseConstructor.bind(this));
235 240
236 /** 241 /**
237 * @this {WebInspector.RemoteObject} 242 * @this {WebInspector.RemoteObject}
238 */ 243 */
(...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 } 1336 }
1332 1337
1333 callback(result); 1338 callback(result);
1334 }, 1339 },
1335 1340
1336 __proto__: WebInspector.RemoteObject.prototype 1341 __proto__: WebInspector.RemoteObject.prototype
1337 } 1342 }
1338 1343
1339 /** 1344 /**
1340 * @constructor 1345 * @constructor
1346 * @param {!WebInspector.RemoteObject} object
1347 */
1348 WebInspector.RemoteArray = function(object)
1349 {
1350 this._object = object;
1351 };
1352
1353 /**
1354 * @param {?WebInspector.RemoteObject} object
1355 * @return {!WebInspector.RemoteArray}
1356 */
1357 WebInspector.RemoteArray.objectAsArray = function(object)
1358 {
1359 if (!object || object.subtype !== "array")
1360 throw new Error("Object is empty or not an array");
1361 return new WebInspector.RemoteArray(object);
1362 }
1363
1364 /**
1365 * @param {!Array<!WebInspector.RemoteObject>} objects
1366 * @return {!Promise<!WebInspector.RemoteArray>}
1367 */
1368 WebInspector.RemoteArray.createFromRemoteObjects = function(objects)
1369 {
1370 if (!objects.length)
1371 throw new Error("Input array is empty");
1372 var objectArguments = [];
1373 for (var i = 0; i < objects.length; ++i)
1374 objectArguments.push(WebInspector.RemoteObject.toCallArgument(objects[i] ))
1375 return objects[0].callFunctionPromise(createArray, objectArguments).then(ret urnRemoteArray);
1376
1377 /**
1378 * @return {!Array<*>}
1379 */
1380 function createArray()
1381 {
1382 if (arguments.length > 1)
1383 return new Array(arguments);
1384 return [arguments[0]];
1385 }
1386
1387 /**
1388 * @param {!WebInspector.CallFunctionResult} result
1389 * @return {!WebInspector.RemoteArray}
1390 */
1391 function returnRemoteArray(result)
1392 {
1393 if (result.wasThrown || !result.object)
1394 throw new Error("Call function throws exceptions or returns empty va lue");
1395 return WebInspector.RemoteArray.objectAsArray(result.object);
1396 }
1397 }
1398
1399 WebInspector.RemoteArray.prototype = {
1400 /**
1401 * @param {number} index
1402 * @return {!Promise<!WebInspector.RemoteObject>}
1403 */
1404 at: function(index)
1405 {
1406 if (index < 0 || index > this._object.arrayLength())
1407 throw new Error("Out of range");
1408 return this._object.callFunctionPromise(at, [WebInspector.RemoteObject.t oCallArgument(index)]).then(assertCallFunctionResult);
1409
1410 /**
1411 * @suppressReceiverCheck
1412 * @param {number} index
1413 * @return {*}
1414 * @this {!Object}
1415 */
1416 function at(index)
1417 {
1418 return this[index];
1419 }
1420
1421 /**
1422 * @param {!WebInspector.CallFunctionResult} result
1423 * @return {!WebInspector.RemoteObject}
1424 */
1425 function assertCallFunctionResult(result)
1426 {
1427 if (result.wasThrown || !result.object)
1428 throw new Error("Exception in callFunction or result value is em pty");
1429 return result.object;
1430 }
1431 },
1432
1433 /**
1434 * @return {number}
1435 */
1436 length: function()
1437 {
1438 return this._object.arrayLength();
1439 },
1440
1441 /**
1442 * @param {function(!WebInspector.RemoteObject):!Promise<T>} func
1443 * @return {!Promise<!Array<T>>}
1444 * @template T
1445 */
1446 map: function(func)
1447 {
1448 var promises = [];
1449 for (var i = 0; i < this.length(); ++i)
1450 promises.push(this.at(i).then(func));
1451 return Promise.all(promises);
1452 },
1453
1454 /**
1455 * @return {!WebInspector.RemoteObject}
1456 */
1457 object: function()
1458 {
1459 return this._object;
1460 }
1461 }
1462
1463 /**
1464 * @constructor
1465 * @param {!WebInspector.RemoteObject} object
1466 */
1467 WebInspector.RemoteFunction = function(object)
1468 {
1469 this._object = object;
1470 }
1471
1472 /**
1473 * @param {?WebInspector.RemoteObject} object
1474 * @return {!WebInspector.RemoteFunction}
1475 */
1476 WebInspector.RemoteFunction.objectAsFunction = function(object)
1477 {
1478 if (!object || object.type !== "function")
1479 throw new Error("Object is empty or not a function");
1480 return new WebInspector.RemoteFunction(object);
1481 }
1482
1483 WebInspector.RemoteFunction.prototype = {
1484 /**
1485 * @return {!Promise<!WebInspector.RemoteObject>}
1486 */
1487 targetFunction: function()
1488 {
1489 return this._object.getOwnPropertiesPromise().then(targetFunction.bind(t his));
1490
1491 /**
1492 * @param {!{properties: ?Array<!WebInspector.RemoteObjectProperty>, int ernalProperties: ?Array<!WebInspector.RemoteObjectProperty>}} ownProperties
1493 * @return {!WebInspector.RemoteObject}
1494 * @this {WebInspector.RemoteFunction}
1495 */
1496 function targetFunction(ownProperties)
1497 {
1498 if (!ownProperties.internalProperties)
1499 return this._object;
1500 var internalProperties = ownProperties.internalProperties;
1501 for (var property of internalProperties) {
1502 if (property.name === "[[TargetFunction]]")
1503 return property.value;
1504 }
1505 return this._object;
1506 }
1507 },
1508
1509 /**
1510 * @return {!WebInspector.RemoteObject}
1511 */
1512 object: function()
1513 {
1514 return this._object;
1515 }
1516 }
1517
1518 /**
1519 * @constructor
1341 * @extends {WebInspector.LocalJSONObject} 1520 * @extends {WebInspector.LocalJSONObject}
1342 * @param {*} value 1521 * @param {*} value
1343 */ 1522 */
1344 WebInspector.MapEntryLocalJSONObject = function(value) 1523 WebInspector.MapEntryLocalJSONObject = function(value)
1345 { 1524 {
1346 WebInspector.LocalJSONObject.call(this, value); 1525 WebInspector.LocalJSONObject.call(this, value);
1347 } 1526 }
1348 1527
1349 WebInspector.MapEntryLocalJSONObject.prototype = { 1528 WebInspector.MapEntryLocalJSONObject.prototype = {
1350 /** 1529 /**
1351 * @override 1530 * @override
1352 * @return {string} 1531 * @return {string}
1353 */ 1532 */
1354 get description() 1533 get description()
1355 { 1534 {
1356 if (!this._cachedDescription) { 1535 if (!this._cachedDescription) {
1357 var children = this._children(); 1536 var children = this._children();
1358 this._cachedDescription = "{" + this._formatValue(children[0].value) + " => " + this._formatValue(children[1].value) + "}"; 1537 this._cachedDescription = "{" + this._formatValue(children[0].value) + " => " + this._formatValue(children[1].value) + "}";
1359 } 1538 }
1360 return this._cachedDescription; 1539 return this._cachedDescription;
1361 }, 1540 },
1362 1541
1363 __proto__: WebInspector.LocalJSONObject.prototype 1542 __proto__: WebInspector.LocalJSONObject.prototype
1364 } 1543 }
OLDNEW
« no previous file with comments | « Source/devtools/front_end/platform/utilities.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698