Forráskód Böngészése

shared context within same namespace

Gerald 12 éve
szülő
commit
d6327e3cfd
4 módosított fájl, 27 hozzáadás és 21 törlés
  1. 1 1
      background.js
  2. 1 1
      confirm.html
  3. 23 17
      injected.js
  4. 2 2
      options.js

+ 1 - 1
background.js

@@ -589,7 +589,7 @@ initDb(function(){
 	setTimeout(autoCheck,2e4);
 	setTimeout(autoCheck,2e4);
 });
 });
 chrome.webRequest.onBeforeRequest.addListener(function(o){
 chrome.webRequest.onBeforeRequest.addListener(function(o){
-	if(/\.user\.js(\?|$)/.test(o.url)) {
+	if(/\.user\.js([\?#]|$)/.test(o.url)) {
 		var x=new XMLHttpRequest();
 		var x=new XMLHttpRequest();
 		x.open('GET',o.url,false);
 		x.open('GET',o.url,false);
 		x.send();
 		x.send();

+ 1 - 1
confirm.html

@@ -2,8 +2,8 @@
 <html class=fill>
 <html class=fill>
 	<head>
 	<head>
 		<meta http-equiv="content-type" content="text/html;charset=utf-8">
 		<meta http-equiv="content-type" content="text/html;charset=utf-8">
+		<link rel="shortcut icon" type="image/png" href="images/icon16.png" />
 		<link rel="stylesheet" type="text/css" href="style.css" />
 		<link rel="stylesheet" type="text/css" href="style.css" />
-		<link rel="shortcut icon" type="image/png" href="icons/icon_16.png" />
 		<script type="text/javascript" src="load.js"></script>
 		<script type="text/javascript" src="load.js"></script>
 		<title class=i18n>extName</title>
 		<title class=i18n>extName</title>
 	</head>
 	</head>

+ 23 - 17
injected.js

@@ -47,9 +47,9 @@ var comm={
 	vmid:'VM'+Math.random(),
 	vmid:'VM'+Math.random(),
 	sid:null,
 	sid:null,
 	did:null,
 	did:null,
-	elements:null,
 	state:0,
 	state:0,
 	load:function(){},
 	load:function(){},
+	utf8decode:utf8decode,
 	prop1:Object.getOwnPropertyNames(window),
 	prop1:Object.getOwnPropertyNames(window),
 	prop2:(function(n,p){
 	prop2:(function(n,p){
 		while(n=Object.getPrototypeOf(n)) p=p.concat(Object.getOwnPropertyNames(n));
 		while(n=Object.getPrototypeOf(n)) p=p.concat(Object.getOwnPropertyNames(n));
@@ -83,9 +83,7 @@ var comm={
 	loadScript:function(o){
 	loadScript:function(o){
 		var start=[],idle=[],end=[],cache,require,values,comm=this;
 		var start=[],idle=[],end=[],cache,require,values,comm=this;
 		comm.command={};comm.requests={};comm.qrequests=[];
 		comm.command={};comm.requests={};comm.qrequests=[];
-		function wrapper(c){
-			var t=this,value=values[c.uri];if(!value) value={};
-
+		function wrapper(){
 			// functions and properties
 			// functions and properties
 			function wrapFunction(o,i,c){
 			function wrapFunction(o,i,c){
 				var f=function(){
 				var f=function(){
@@ -109,19 +107,23 @@ var comm={
 					});
 					});
 				}catch(e){}
 				}catch(e){}
 			}
 			}
-			var itemWrapper=null;comm.prop1.forEach(wrapItem);
-			itemWrapper=wrapFunction;comm.prop2.forEach(wrapItem);
-
+			var t=this,itemWrapper=null;
+			comm.prop1.forEach(wrapItem);
+			itemWrapper=wrapFunction;
+			comm.prop2.forEach(wrapItem);
+		}
+		function wrapGM(c){
+			var gm={},value=values[c.uri];if(!value) value={};
 			function getCache(name){for(var i in resources) if(name==i) return cache[resources[i]];}
 			function getCache(name){for(var i in resources) if(name==i) return cache[resources[i]];}
 			function propertyToString(){return 'Property for Violentmonkey: designed by Gerald';}
 			function propertyToString(){return 'Property for Violentmonkey: designed by Gerald';}
 			function addProperty(name,prop,obj){
 			function addProperty(name,prop,obj){
 				if('value' in prop) prop.writable=false;
 				if('value' in prop) prop.writable=false;
 				prop.configurable=false;
 				prop.configurable=false;
-				if(!obj) {obj=t;ele.push(name);}
+				if(!obj) obj=gm;
 				Object.defineProperty(obj,name,prop);
 				Object.defineProperty(obj,name,prop);
 				if(typeof obj[name]=='function') obj[name].toString=propertyToString;
 				if(typeof obj[name]=='function') obj[name].toString=propertyToString;
 			}
 			}
-			var resources=c.meta.resources||{},ele=[];
+			var resources=c.meta.resources||{};
 			addProperty('unsafeWindow',{value:window});
 			addProperty('unsafeWindow',{value:window});
 
 
 			// GM functions
 			// GM functions
@@ -175,7 +177,7 @@ var comm={
 			}});
 			}});
 			addProperty('GM_getResourceText',{value:function(name){
 			addProperty('GM_getResourceText',{value:function(name){
 				var b=getCache(name);
 				var b=getCache(name);
-				if(b) b=utf8decode(b);
+				if(b) b=comm.utf8decode(b);
 				return b;
 				return b;
 			}});
 			}});
 			addProperty('GM_getResourceURL',{value:function(name){
 			addProperty('GM_getResourceURL',{value:function(name){
@@ -225,19 +227,23 @@ var comm={
 				var r=new Request(details);
 				var r=new Request(details);
 				return r.req;
 				return r.req;
 			}});
 			}});
-			if(!comm.elements) comm.elements=ele;
+			return gm;
 		}
 		}
 		function run(l){while(l.length) runCode(l.shift());}
 		function run(l){while(l.length) runCode(l.shift());}
 		function runCode(c){
 		function runCode(c){
-			var req=c.meta.require||[],i,r=[],code=[],w=new wrapper(c);
-			comm.elements.forEach(function(i){r.push(i+'=window.'+i);});
-			code=['(function(){'];
-			if(r.length) code.push('var '+r.join(',')+';');
+			var w,req=c.meta.require||[],i,r=[],code=[],g;
+			if(w=i=c.meta.namespace) w=wrappers[w];
+			if(!w) w=new wrapper();
+			if(i) wrappers[i]=w;
+			g=wrapGM(c);
+			Object.getOwnPropertyNames(g).forEach(function(i){r.push(i+'=g["'+i+'"]');});
+			code=[];
+			if(r.length) code.push('var '+r.join(',')+';delete g;with(this)(function(){');
 			for(i=0;i<req.length;i++) if(r=require[req[i]]) code.push(r);
 			for(i=0;i<req.length;i++) if(r=require[req[i]]) code.push(r);
 			code.push(c.code);code.push('}).call(window);');
 			code.push(c.code);code.push('}).call(window);');
 			code=code.join('\n');
 			code=code.join('\n');
 			try{
 			try{
-				(new Function('w','with(w) '+code)).call(this,w);
+				(new Function('g',code)).call(w,g);
 			}catch(e){
 			}catch(e){
 				console.log('Error running script: '+(c.custom.name||c.meta.name||c.id)+'\n'+e);
 				console.log('Error running script: '+(c.custom.name||c.meta.name||c.id)+'\n'+e);
 			}
 			}
@@ -247,7 +253,7 @@ var comm={
 			if(comm.state>1) run(end);
 			if(comm.state>1) run(end);
 		};
 		};
 
 
-		var l;
+		var l,wrappers={};
 		o.scripts.forEach(function(i){
 		o.scripts.forEach(function(i){
 			if(i&&i.enabled) {
 			if(i&&i.enabled) {
 				switch(i.custom['run-at']||i.meta['run-at']){
 				switch(i.custom['run-at']||i.meta['run-at']){

+ 2 - 2
options.js

@@ -294,12 +294,12 @@ var E=$('editor'),U=$('eUpdate'),M=$('meta'),
     cI=$('cInclude'),cE=$('cExclude'),cM=$('cMatch'),
     cI=$('cInclude'),cE=$('cExclude'),cM=$('cMatch'),
 		eS=$('eSave'),eSC=$('eSaveClose'),T;
 		eS=$('eSave'),eSC=$('eSaveClose'),T;
 function markClean(){
 function markClean(){
-	T.clearHistory();
 	eS.disabled=eSC.disabled=true;
 	eS.disabled=eSC.disabled=true;
 }
 }
 function gotScript(o){
 function gotScript(o){
 	switchTo(E);E.scr=o;U.checked=o.update;
 	switchTo(E);E.scr=o;U.checked=o.update;
-	T.setValueAndFocus(o.code);markClean();
+	T.setValueAndFocus(o.code);
+	T.clearHistory();markClean();
 }
 }
 function eSave(){
 function eSave(){
 	chrome.runtime.sendMessage({
 	chrome.runtime.sendMessage({