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

Side by Side Diff: chrome/test/chromedriver/js/call_function.js

Issue 2854823003: [Chromedriver] Fix stack overflow in JavaScript code (Closed)
Patch Set: Created 3 years, 7 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 | « no previous file | 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 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * Enum for WebDriver status codes. 6 * Enum for WebDriver status codes.
7 * @enum {number} 7 * @enum {number}
8 */ 8 */
9 var StatusCode = { 9 var StatusCode = {
10 STALE_ELEMENT_REFERENCE: 10, 10 STALE_ELEMENT_REFERENCE: 10,
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 value.nodeType == NodeType.ELEMENT)) { 264 value.nodeType == NodeType.ELEMENT)) {
265 var nodeType = value['nodeType']; 265 var nodeType = value['nodeType'];
266 if (nodeType == NodeType.ELEMENT || nodeType == NodeType.DOCUMENT 266 if (nodeType == NodeType.ELEMENT || nodeType == NodeType.DOCUMENT
267 || (SHADOW_DOM_ENABLED && value instanceof ShadowRoot)) { 267 || (SHADOW_DOM_ENABLED && value instanceof ShadowRoot)) {
268 var wrapped = {}; 268 var wrapped = {};
269 var root = getNodeRootThroughAnyShadows(value); 269 var root = getNodeRootThroughAnyShadows(value);
270 wrapped[ELEMENT_KEY] = getPageCache(root, w3cEnabled).storeItem(value); 270 wrapped[ELEMENT_KEY] = getPageCache(root, w3cEnabled).storeItem(value);
271 return wrapped; 271 return wrapped;
272 } 272 }
273 273
274 var obj = (typeof(value.length) == 'number') ? [] : {}; 274 var obj;
275 for (var prop in value) 275 if (typeof(value.length) == 'number') {
276 obj[prop] = wrap(value[prop]); 276 obj = [];
277 for (var i = 0; i < value.length; i++)
278 obj[i] = wrap(value[i]);
279 } else {
280 obj = {};
281 for (var prop in value)
282 obj[prop] = wrap(value[prop]);
283 }
277 return obj; 284 return obj;
278 } 285 }
279 return value; 286 return value;
280 } 287 }
281 288
282 /** 289 /**
283 * Unwraps the given value by converting from object IDs to the cached 290 * Unwraps the given value by converting from object IDs to the cached
284 * objects. 291 * objects.
285 * 292 *
286 * @param {*} value The value to unwrap. 293 * @param {*} value The value to unwrap.
287 * @param {Cache} cache The cache to retrieve wrapped elements from. 294 * @param {Cache} cache The cache to retrieve wrapped elements from.
288 * @return {*} The unwrapped value. 295 * @return {*} The unwrapped value.
289 */ 296 */
290 function unwrap(value, cache) { 297 function unwrap(value, cache) {
291 if (typeof(value) == 'object' && value != null) { 298 if (typeof(value) == 'object' && value != null) {
292 if (ELEMENT_KEY in value) 299 if (ELEMENT_KEY in value)
293 return cache.retrieveItem(value[ELEMENT_KEY]); 300 return cache.retrieveItem(value[ELEMENT_KEY]);
294 301
295 var obj = (typeof(value.length) == 'number') ? [] : {}; 302 var obj;
296 for (var prop in value) 303 if (typeof(value.length) == 'number') {
297 obj[prop] = unwrap(value[prop], cache); 304 obj = [];
305 for (var i = 0; i < value.length; i++)
306 obj[i] = unwrap(value[i], cache);
307 } else {
308 obj = {};
309 for (var prop in value)
310 obj[prop] = unwrap(value[prop], cache);
311 }
298 return obj; 312 return obj;
299 } 313 }
300 return value; 314 return value;
301 } 315 }
302 316
303 /** 317 /**
304 * Calls a given function and returns its value. 318 * Calls a given function and returns its value.
305 * 319 *
306 * The inputs to and outputs of the function will be unwrapped and wrapped 320 * The inputs to and outputs of the function will be unwrapped and wrapped
307 * respectively, unless otherwise specified. This wrapping involves converting 321 * respectively, unless otherwise specified. This wrapping involves converting
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 var returnValue = wrap(func.apply(null, unwrap(args, cache))); 361 var returnValue = wrap(func.apply(null, unwrap(args, cache)));
348 } catch (error) { 362 } catch (error) {
349 status = error.code || StatusCode.UNKNOWN_ERROR; 363 status = error.code || StatusCode.UNKNOWN_ERROR;
350 var returnValue = error.message; 364 var returnValue = error.message;
351 } 365 }
352 return { 366 return {
353 status: status, 367 status: status,
354 value: returnValue 368 value: returnValue
355 } 369 }
356 } 370 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698