Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: polyfill.js

Issue 29590603: Issue 5954 - Read-only properties cannot be assigned in strict mode in Edge (Closed)
Patch Set: Created Oct. 27, 2017, 1:10 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: polyfill.js
===================================================================
--- a/polyfill.js
+++ b/polyfill.js
@@ -69,48 +69,55 @@
let func = object[name];
if (!func)
return;
-
- object[name] = function(...args)
- {
- let callStack = new Error().stack;
-
- if (typeof args[args.length - 1] == "function")
- return func.apply(object, args);
+ let descriptor = Reflect.getOwnPropertyDescriptor(object, name);
Oleksandr 2017/10/27 13:12:37 We cannot use Object.getOwnPropertyDescriptor beca
Manish Jethani 2017/10/27 14:25:16 We can use Object.getOwnPropertyDescriptor here si
- // If the last argument is undefined, we drop it from the list assuming
- // it stands for the optional callback. We must do this, because we have
- // to replace it with our own callback. If we simply append our own
- // callback to the list, it won't match the signature of the function and
- // will cause an exception.
- if (typeof args[args.length - 1] == "undefined")
- args.pop();
-
- return new Promise((resolve, reject) =>
- {
- func.call(object, ...args, result =>
+ if (descriptor && descriptor.configurable)
Oleksandr 2017/10/27 13:12:38 There isn't really an object in our list that does
Manish Jethani 2017/10/27 14:25:16 Yes, we should remove it. If it's not configurabl
+ {
+ Object.defineProperty(object, name, {
Manish Jethani 2017/10/27 14:25:16 You could just do: descriptor.value = (...args)
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: (...args) =>
{
- let error = browser.runtime.lastError;
- if (error && !portClosedBeforeResponseError.test(error.message))
- {
- // runtime.lastError is already an Error instance on Edge, while on
- // Chrome it is a plain object with only a message property.
- if (!(error instanceof Error))
- {
- error = new Error(error.message);
+ let callStack = new Error().stack;
+ if (typeof args[args.length - 1] == "function")
+ return func.apply(object, args);
+
+ // If the last argument is undefined, we drop it from the list
+ // assuming it stands for the optional callback. We must do this,
+ // because we have to replace it with our own callback. If we simply
+ // append our own callback to the list, it won't match the signature
+ // of the function and will cause an exception.
+ if (typeof args[args.length - 1] == "undefined")
+ args.pop();
- // Add a more helpful stack trace.
- error.stack = callStack;
- }
+ return new Promise((resolve, reject) =>
+ {
+ func.call(object, ...args, result =>
+ {
+ let error = browser.runtime.lastError;
+ if (error && !portClosedBeforeResponseError.test(error.message))
+ {
+ // runtime.lastError is already an Error instance on Edge, while
+ // on Chrome it is a plain object with only a message property.
+ if (!(error instanceof Error))
+ {
+ error = new Error(error.message);
- reject(error);
- }
- else
- {
- resolve(result);
- }
- });
- });
- };
+ // Add a more helpful stack trace.
+ error.stack = callStack;
+ }
+
+ reject(error);
+ }
+ else
+ {
+ resolve(result);
+ }
+ });
+ });
+ }});
+ }
}
function shouldWrapAPIs()
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld