public
Last active

Attempt to describe a self-hosted version of WindowProxy

  • Download Gist
WindowProxy.js
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
// Reusing parts of https://gist.github.com/4279162
 
function WindowProxyHandler(target){
this.target = target;
}
 
WindowProxyHandler.prototype = {
get: function (_, name) {
return this.target[name];
},
set: function (_, name, value) {
return this.target[name] = value;
},
getOwnPropertyDescriptor: function (_, name) {
return Object.getOwnPropertyDescriptor(this.target, name);
},
defineProperty: function(_, name, desc){
if(desc.configurable === false)
throw new TypeError('Nope');
else
return Object.defineProperty(this.target, name, desc);
},
isExtensible: function () {
return true;
},
isSealed: function () {
return false;
},
isFrozen: function () {
return false;
},
preventExtensions: function(){
throw new TypeError('Nope');
},
freeze: function(){
throw new TypeError('Nope');
},
seal: function(){
throw new TypeError('Nope');
}
};
 
function retargetableProxy(target, dummyTarget) {
var handler = new WindowProxyHandler(target);
return {
proxy: new Proxy(dummyTarget, handler),
setTarget: function(newTarget){
handler.target = newTarget;
}
};
}
 
 
function Window(){/* create window instances */}
 
var dummyWindowProxyTarget = {
get location(){},
set location(url){},
get document(){}
// ...
};
 
function WindowProxy(){
var {proxy, setTarget} = retargetableProxy(new Window(), dummyWindowProxyTarget);
return proxy;
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.