WebBrowser/GreaseMonkey/GreaseMonkeyJavaScript.py

changeset 6128
afc2cda1a743
parent 6048
82ad8ec9548c
child 6326
5ef9456a0cbe
--- a/WebBrowser/GreaseMonkey/GreaseMonkeyJavaScript.py	Sat Feb 10 17:24:42 2018 +0100
+++ b/WebBrowser/GreaseMonkey/GreaseMonkeyJavaScript.py	Sat Feb 10 19:53:07 2018 +0100
@@ -10,119 +10,110 @@
 from __future__ import unicode_literals
 
 bootstrap_js = """
-if(typeof GM_xmlhttpRequest === "undefined") {
-    GM_xmlhttpRequest = function(/* object */ details) {
-        details.method = details.method.toUpperCase() || "GET";
+var GM = {
+    info: {
+        script: {
+            description: "",
+            excludes: [],
+            includes: [],
+            matches: [],
+            name: "",
+            namespace: "",
+            resources: {},
+            'run-at': "document-end",
+            version: ""
+        },
+        scriptMetaStr: "",
+        scriptHandler: "eric Browser GreaseMonkey",
+        version: "4.0"
+    }
+};
+window.GM = GM;
 
-        if(!details.url) {
-            throw("GM_xmlhttpRequest requires an URL.");
-        }
+function GM_info() {
+    return GM.info;
+}
+
+function GM_xmlhttpRequest(/* object */ details) {
+    details.method = details.method.toUpperCase() || "GET";
+
+    if (!details.url) {
+        throw("GM_xmlhttpRequest requires an URL.");
+    }
 
-        // build XMLHttpRequest object
-        var oXhr = new XMLHttpRequest;
-        // run it
-        if(oXhr) {
-            if("onreadystatechange" in details)
-                oXhr.onreadystatechange = function() {
-                    details.onreadystatechange(oXhr)
-                };
-            if("onload" in details)
-                oXhr.onload = function() { details.onload(oXhr) };
-            if("onerror" in details)
-                oXhr.onerror = function() { details.onerror(oXhr) };
+    // build XMLHttpRequest object
+    var oXhr = new XMLHttpRequest;
+    // run it
+    if("onreadystatechange" in details)
+        oXhr.onreadystatechange = function() {
+            details.onreadystatechange(oXhr) };
+    if("onload" in details)
+        oXhr.onload = function() { details.onload(oXhr) };
+    if("onerror" in details)
+        oXhr.onerror = function() { details.onerror(oXhr) };
+
+    oXhr.open(details.method, details.url, true);
+
+    if("headers" in details)
+        for(var header in details.headers)
+            oXhr.setRequestHeader(header, details.headers[header]);
 
-            oXhr.open(details.method, details.url, true);
-
-            if("headers" in details)
-                for(var header in details.headers)
-                    oXhr.setRequestHeader(header, details.headers[header]);
+    if("data" in details)
+        oXhr.send(details.data);
+    else
+        oXhr.send();
+}
 
-            if("data" in details)
-                oXhr.send(details.data);
-            else
-                oXhr.send();
-        } else
-            throw ("This Browser is not supported, please upgrade.")
+function GM_addStyle(/* string */ styles) {
+    var head = document.getElementsByTagName("head")[0];
+    if (head === undefined) {
+        document.onreadystatechange = function() {
+            if (document.readyState == "interactive") {
+                var oStyle = document.createElement("style");
+                oStyle.setAttribute("type", "text/css");
+                oStyle.appendChild(document.createTextNode(styles));
+                document.getElementsByTagName("head")[0].appendChild(oStyle);
+            }
+        }
+    }
+    else {
+        var oStyle = document.createElement("style");
+        oStyle.setAttribute("type", "text/css");
+        oStyle.appendChild(document.createTextNode(styles));
+        head.appendChild(oStyle);
     }
 }
 
-if(typeof GM_addStyle === "undefined") {
-    function GM_addStyle(/* String */ styles) {
-        var head = document.getElementsByTagName("head")[0];
-        if (head === undefined) {
-            document.onreadystatechange = function() {
-                if (document.readyState == "interactive") {
-                  var oStyle = document.createElement("style");
-                  oStyle.setAttribute("type", "text\/css");
-                  oStyle.appendChild(document.createTextNode(styles));
-                  document.getElementsByTagName("head")[0].appendChild(oStyle);
-                }
-            }
-        }
-        else {
-            var oStyle = document.createElement("style");
-            oStyle.setAttribute("type", "text\/css");
-            oStyle.appendChild(document.createTextNode(styles));
-            head.appendChild(oStyle);
-        }
-    }
+function GM_log(log) {
+    if(console)
+        console.log(log);
 }
 
-if(typeof GM_log === "undefined") {
-    function GM_log(log) {
-        if(console)
-            console.log(log);
-    }
+function GM_openInTab(url) {
+    return window.open(url);
 }
 
-if(typeof GM_openInTab === "undefined") {
-    function GM_openInTab(url) {
-        window.open(url)
-    }
+function GM_setClipboard(text) {
+    external.extra.greasemonkey.setClipboard(text);
 }
 
-// Define unsafe window
-var unsafeWindow = window;
-window.wrappedJSObject = unsafeWindow;
+// GM_registerMenuCommand not supported
+function GM_registerMenuCommand(caption, commandFunc, accessKey) { }
 
-// GM_registerMenuCommand not supported
-if(typeof GM_registerMenuCommand === "undefined") {
-    function GM_registerMenuCommand(caption, commandFunc, accessKey) { }
-}
-
-// GM Resource not supported
-if(typeof GM_getResourceText === "undefined") {
-    function GM_getResourceText(resourceName) {
-        throw ("eric6 Web Browser: GM Resource is not supported!");
-    }
-}
+// GM_getResourceUrl not supported
+function GM_getResourceUrl(resourceName) { }
 
-if(typeof GM_getResourceURL === "undefined") {
-    function GM_getResourceURL(resourceName) {
-        throw ("eric6 Web Browser: GM Resource is not supported!");
-    }
-}
-
-// GM Settings not supported
-if(typeof GM_getValue === "undefined") {
-    function GM_getValue(name, defaultValue) {
-        return defaultValue;
-    }
-}
+// GreaseMonkey 4.0 support
+GM.openInTab = GM_openInTab;
+GM.setClipboard = GM_setClipboard;
+GM.xmlhttpRequest = GM_xmlhttpRequest;
 
-if(typeof GM_setValue === "undefined") {
-    function GM_setValue(name, value) { }
-}
-
-if(typeof GM_deleteValue === "undefined") {
-    function GM_deleteValue(name) { }
-}
-
-if(typeof GM_listValues === "undefined") {
-    function GM_listValues() {
-        return new Array("");
-    }
-}
+// GM_getResourceUrl not supported
+GM.getResourceUrl = function(resourceName) {
+    return new Promise((resolve, reject) => {
+        reject();
+    });
+};
 """
 
 
@@ -152,4 +143,90 @@
 function GM_setValue(aKey, aVal) {{
     localStorage.setItem("{0}" + aKey, aVal);
 }}
+
+// GreaseMonkey 4.0 support
+var asyncCall = (func) => {{
+    if (window._eric_external) {{
+        func();
+    }} else {{
+        document.addEventListener("_eric_external_created", func);
+    }}
+}};
+
+var decode = (val) => {{
+    val = String(val);
+    if (!val.length) {{
+        return val;
+    }}
+    var v = val.substr(1);
+    if (val[0] == "b") {{
+        return Boolean(v == "true" ? true : false);
+    }} else if (val[0] == "i") {{
+        return Number(v);
+    }} else if (val[0] == "s") {{
+        return v;
+    }} else {{
+        return undefined;
+    }}
+}};
+
+var encode = (val) => {{
+    if (typeof val == "boolean") {{
+        return "b" + (val ? "true" : "false");
+    }} else if (typeof val == "number") {{
+        return "i" + String(val);
+    }} else if (typeof val == "string") {{
+        return "s" + val;
+    }} else {{
+        return "";
+    }}
+}};
+
+GM.deleteValue = function(name) {{
+    return new Promise((resolve, reject) => {{
+        asyncCall(() => {{
+            external.extra.greasemonkey.deleteValue("{0}", name, (res) => {{
+                if (res) {{
+                    resolve();
+                }} else {{
+                    reject();
+                }}
+            }});
+        }});
+    }});
+}};
+
+GM.getValue = function(name, value) {{
+    return new Promise((resolve) => {{
+        asyncCall(() => {{
+            external.extra.greasemonkey.getValue("{0}", name, encode(value),
+                                                 (res) => {{
+                resolve(decode(res));
+            }});
+        }});
+    }});
+}};
+
+GM.setValue = function(name, value) {{
+    return new Promise((resolve, reject) => {{
+        asyncCall(() => {{
+            external.extra.greasemonkey.setValue("{0}", name, encode(value),
+                                                 (res) => {{
+                if (res) {{
+                    resolve();
+                }} else {{
+                    reject();
+                }}
+            }});
+        }});
+    }});
+}};
+
+GM.listValues = function() {{
+    return new Promise((resolve) => {{
+        asyncCall(() => {{
+            external.extra.greasemonkey.listValues("{0}", resolve);
+        }});
+    }});
+}};
 """

eric ide

mercurial