Skip to content

Commit 4ed3807

Browse files
authored
Merge pull request #140 from marcelduran/develop
Deep clone the options object so we don't mutate it. Closes #55
2 parents 5dde754 + d41f804 commit 4ed3807

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

lib/helper.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,25 @@ function setQuery(map, options, query) {
237237
return query;
238238
}
239239

240+
function deepClone(obj) {
241+
var newObj, value, key;
242+
243+
if (typeof obj !== "object" || obj === null) {
244+
return obj;
245+
}
246+
247+
newObj = Array.isArray(obj) ? [] : {};
248+
249+
for (key in obj) {
250+
value = obj[key];
251+
252+
// Recursively (deep) copy for nested objects, including arrays
253+
newObj[key] = deepClone(value);
254+
}
255+
256+
return newObj;
257+
}
258+
240259
module.exports = {
241260
xmlToObj: xmlToObj,
242261
csvToObj: svToObj.bind(null, ',', false),
@@ -249,5 +268,6 @@ module.exports = {
249268
normalizeServer: normalizeServer,
250269
localhost: localhost,
251270
setQuery: setQuery,
252-
WPTAPIError: WPTAPIError
271+
WPTAPIError: WPTAPIError,
272+
deepClone: deepClone
253273
};

lib/webpagetest.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ function getTestResults(id, options, callback) {
281281
var query = {test: id};
282282

283283
callback = callback || typeof options === 'function' && options;
284-
options = options === callback ? {} : options || {};
284+
options = options === callback ? {} : helper.deepClone(options) || {};
285285
helper.setQuery(mapping.commands.results, options, query);
286286

287287
// specs
@@ -317,8 +317,8 @@ function runTest(what, options, callback) {
317317
var query = {};
318318

319319
callback = callback || options;
320-
options = options === callback ? {} : options;
321-
320+
options = options === callback ? {} : helper.deepClone(options);
321+
322322
// testing url or script?
323323
query[reSpace.test(what) ? 'script' : 'url'] = what;
324324
// set dummy url when scripting, needed when webdriver script
@@ -479,7 +479,7 @@ function restartTest(id, options, callback) {
479479
var query = {resubmit: id};
480480

481481
callback = callback || options;
482-
options = options === callback ? undefined : options;
482+
options = options === callback ? undefined : helper.deepClone(options);
483483

484484
helper.setQuery(mapping.commands.restart, options, query);
485485

@@ -490,7 +490,7 @@ function cancelTest(id, options, callback) {
490490
var query = {test: id};
491491

492492
callback = callback || options;
493-
options = options === callback ? undefined : options;
493+
options = options === callback ? undefined : helper.deepClone(options);
494494

495495
helper.setQuery(mapping.commands.cancel, options, query);
496496

0 commit comments

Comments
 (0)