Quellcode durchsuchen

improved property wrappers

load properties when they are first accessed

Signed-off-by: Gerald <[email protected]>
Gerald vor 11 Jahren
Ursprung
Commit
cc4231fe03
2 geänderte Dateien mit 40 neuen und 11 gelöschten Zeilen
  1. 40 8
      injected.js
  2. 0 3
      options.js

+ 40 - 8
injected.js

@@ -145,7 +145,7 @@ var comm={
 		}
 		function wrapper(){
 			// functions and properties
-			function wrapFunction(o,i,c){
+			/*function wrapFunction(o,i,c){
 				var f=function(){
 					var r;
 					try{r=Function.apply.apply(o[i],[o,arguments]);}
@@ -155,9 +155,42 @@ var comm={
 				f.__proto__=o[i];f.prototype=o[i].prototype;
 				return f;
 			}
-			function wrapWindow(w){return w==window?t:w;}
-			function wrapItem(i){
-				try{	// avoid reading protected data
+			function wrapWindow(w){return w==window?t:w;}*/
+			function wrapItem(i,wrap){
+				var type=null,value;
+				function initProperty() {
+					if(!type) {
+						value=window[i];
+						type=typeof value;
+						if(type=='function'&&wrap) {
+							var o=value;
+							value=function(){
+								var r;
+								try {
+									r=Function.apply.apply(o,[window,arguments]);
+								} catch(e) {
+									console.log('Error calling '+i+':\n'+e.stack);
+								}
+								return r===window?t:r;
+							};
+							value.__proto__=o;
+							value.prototype=o.prototype;
+						}
+					}
+				}
+				Object.defineProperty(t,i,{
+					get:function(){
+						initProperty();
+						return value===window?t:value;
+					},
+					set:function(v){
+						initProperty();
+						value=v;
+						if(type!='function') window[i]=v;
+						type='custom';
+					},
+				});
+				/*try{	// avoid reading protected data
 					if(typeof window[i]=='function') {
 						if(itemWrapper) t[i]=itemWrapper(window,i,wrapWindow);
 						else t[i]=window[i];
@@ -165,12 +198,11 @@ var comm={
 						get:function(){return wrapWindow(window[i]);},
 						set:function(v){window[i]=v;},
 					});
-				}catch(e){}
+				}catch(e){}*/
 			}
-			var t=this,itemWrapper=null;
+			var t=this/*,itemWrapper=null*/;
 			comm.prop1.forEach(wrapItem);
-			itemWrapper=wrapFunction;
-			comm.prop2.forEach(wrapItem);
+			comm.prop2.forEach(function(i){wrapItem(i,true);});
 		}
 		function wrapGM(c){
 			// Add GM functions

+ 0 - 3
options.js

@@ -324,13 +324,10 @@ function mReset(){
 	}
 	cI.checked=c._include!=false;
 	mI.value=(c.include||e).join('\n');
-	mI.placeholder=m.include.join('\n');
 	cM.checked=c._match!=false;
 	mM.value=(c.match||e).join('\n');
-	mM.placeholder=m.match.join('\n');
 	cE.checked=c._exclude!=false;
 	mE.value=(c.exclude||e).join('\n');
-	mE.placeholder=m.exclude.join('\n');
 }
 function gotScript(o){
 	E.classList.remove('hide');