--- a/WebBrowser/Tools/Scripts.py Fri Feb 09 19:44:25 2018 +0100 +++ b/WebBrowser/Tools/Scripts.py Sat Feb 10 17:24:42 2018 +0100 @@ -27,41 +27,49 @@ @rtype str """ source = """ - (function() {{ - {0} - - function registerExternal(e) {{ - window.external = e; - if (window.external) {{ - var event = document.createEvent('Event'); - event.initEvent('_eric_external_created', true, true); - document.dispatchEvent(event); - }} - }} - - if (self !== top) {{ - if (top.external) +(function() {{ + {0} + + function registerExternal(e) {{ + window.external = e; + if (window.external) {{ + var event = document.createEvent('Event'); + event.initEvent('_eric_external_created', true, true); + document.dispatchEvent(event); + }} + }} + + if (self !== top) {{ + if (top.external) + registerExternal(top.external); + else + top.document.addEventListener( + '_eric_external_created', function() {{ registerExternal(top.external); - else - top.document.addEventListener( - '_eric_external_created', function() {{ - registerExternal(top.external); - }}); - return; - }} + }}); + return; + }} - function registerWebChannel() {{ - try {{ - new QWebChannel(qt.webChannelTransport, function(channel) {{ - registerExternal(channel.objects.eric_object); - }}); - }} catch (e) {{ - setTimeout(registerWebChannel, 100); + function registerWebChannel() {{ + try {{ + new QWebChannel(qt.webChannelTransport, function(channel) {{ + registerExternal(channel.objects.eric_object); + var external = channel.objects.eric_object; + external.extra = {{}}; + for (var key in channel.objects) {{ + if (key != 'eric_object' && key.startsWith('eric_')) {{ + external.extra[key.substr(3)] = channel.objects[key]; + }} }} - }} - registerWebChannel(); + registerExternal(external); + }}); + }} catch (e) {{ + setTimeout(registerWebChannel, 100); + }} + }} + registerWebChannel(); - }})()""" +}})()""" return source.format(readAllFileContents(":/javascript/qwebchannel.js")) @@ -76,12 +84,12 @@ @rtype str """ source = """ - (function() {{ - var css = document.createElement('style'); - css.setAttribute('type', 'text/css'); - css.appendChild(document.createTextNode('{0}')); - document.getElementsByTagName('head')[0].appendChild(css); - }})()""" +(function() {{ + var css = document.createElement('style'); + css.setAttribute('type', 'text/css'); + css.appendChild(document.createTextNode('{0}')); + document.getElementsByTagName('head')[0].appendChild(css); +}})()""" style = css.replace("'", "\\'").replace("\n", "\\n") return source.format(style) @@ -97,30 +105,30 @@ @rtype str """ source = """ - (function() {{ - var e = document.elementFromPoint({0}, {1}); - if (!e || e.tagName != 'INPUT') - return; - var fe = e.parentElement; - while (fe) {{ - if (fe.tagName == 'FORM') - break; - fe = fe.parentElement; - }} - if (!fe) - return; - var res = {{ - method: fe.method.toLowerCase(), - action: fe.action, - inputName: e.name, - inputs: [], - }}; - for (var i = 0; i < fe.length; ++i) {{ - var input = fe.elements[i]; - res.inputs.push([input.name, input.value]); - }} - return res; - }})()""" +(function() {{ + var e = document.elementFromPoint({0}, {1}); + if (!e || e.tagName != 'INPUT') + return; + var fe = e.parentElement; + while (fe) {{ + if (fe.tagName == 'FORM') + break; + fe = fe.parentElement; + }} + if (!fe) + return; + var res = {{ + method: fe.method.toLowerCase(), + action: fe.action, + inputName: e.name, + inputs: [], + }}; + for (var i = 0; i < fe.length; ++i) {{ + var input = fe.elements[i]; + res.inputs.push([input.name, input.value]); + }} + return res; +}})()""" return source.format(pos.x(), pos.y()) @@ -132,18 +140,18 @@ @rtype str """ source = """ - (function() { - var out = []; - var imgs = document.getElementsByTagName('img'); - for (var i = 0; i < imgs.length; ++i) { - var e = imgs[i]; - out.push({ - src: e.src, - alt: e.alt - }); - } - return out; - })()""" +(function() { + var out = []; + var imgs = document.getElementsByTagName('img'); + for (var i = 0; i < imgs.length; ++i) { + var e = imgs[i]; + out.push({ + src: e.src, + alt: e.alt + }); + } + return out; +})()""" return source @@ -155,20 +163,20 @@ @rtype str """ source = """ - (function() { - var out = []; - var meta = document.getElementsByTagName('meta'); - for (var i = 0; i < meta.length; ++i) { - var e = meta[i]; - out.push({ - name: e.getAttribute('name'), - content: e.getAttribute('content'), - httpequiv: e.getAttribute('http-equiv'), - charset: e.getAttribute('charset') - }); - } - return out; - })()""" +(function() { + var out = []; + var meta = document.getElementsByTagName('meta'); + for (var i = 0; i < meta.length; ++i) { + var e = meta[i]; + out.push({ + name: e.getAttribute('name'), + content: e.getAttribute('content'), + httpequiv: e.getAttribute('http-equiv'), + charset: e.getAttribute('charset') + }); + } + return out; +})()""" return source @@ -180,20 +188,20 @@ @rtype str """ source = """ - (function() { - var out = []; - var links = document.getElementsByTagName('link'); - for (var i = 0; i < links.length; ++i) { - var e = links[i]; - if (e.type == 'application/opensearchdescription+xml') { - out.push({ - url: e.getAttribute('href'), - title: e.getAttribute('title') - }); - } - } - return out; - })()""" +(function() { + var out = []; + var links = document.getElementsByTagName('link'); + for (var i = 0; i < links.length; ++i) { + var e = links[i]; + if (e.type == 'application/opensearchdescription+xml') { + out.push({ + url: e.getAttribute('href'), + title: e.getAttribute('title') + }); + } + } + return out; +})()""" return source @@ -209,21 +217,21 @@ @rtype str """ source = """ - (function() {{ - var form = document.createElement('form'); - form.setAttribute('method', 'POST'); - form.setAttribute('action', '{0}'); - var val; - {1} - form.submit(); - }})()""" +(function() {{ + var form = document.createElement('form'); + form.setAttribute('method', 'POST'); + form.setAttribute('action', '{0}'); + var val; + {1} + form.submit(); +}})()""" valueSource = """ - val = document.createElement('input'); - val.setAttribute('type', 'hidden'); - val.setAttribute('name', '{0}'); - val.setAttribute('value', '{1}'); - form.appendChild(val);""" +val = document.createElement('input'); +val.setAttribute('type', 'hidden'); +val.setAttribute('name', '{0}'); +val.setAttribute('value', '{1}'); +form.appendChild(val);""" values = "" query = QUrlQuery(data) @@ -243,68 +251,68 @@ @rtype str """ source = """ - (function() { - function findUsername(inputs) { - var usernameNames = ['user', 'name', 'login']; - for (var i = 0; i < usernameNames.length; ++i) { - for (var j = 0; j < inputs.length; ++j) - if (inputs[j].type == 'text' && - inputs[j].value.length && - inputs[j].name.indexOf(usernameNames[i]) != -1) - return inputs[j].value; - } - for (var i = 0; i < inputs.length; ++i) - if (inputs[i].type == 'text' && inputs[i].value.length) - return inputs[i].value; - for (var i = 0; i < inputs.length; ++i) - if (inputs[i].type == 'email' && inputs[i].value.length) - return inputs[i].value; - return ''; +(function() { + function findUsername(inputs) { + var usernameNames = ['user', 'name', 'login']; + for (var i = 0; i < usernameNames.length; ++i) { + for (var j = 0; j < inputs.length; ++j) + if (inputs[j].type == 'text' && + inputs[j].value.length && + inputs[j].name.indexOf(usernameNames[i]) != -1) + return inputs[j].value; + } + for (var i = 0; i < inputs.length; ++i) + if (inputs[i].type == 'text' && inputs[i].value.length) + return inputs[i].value; + for (var i = 0; i < inputs.length; ++i) + if (inputs[i].type == 'email' && inputs[i].value.length) + return inputs[i].value; + return ''; + } + + function registerForm(form) { + form.addEventListener('submit', function() { + var form = this; + var data = ''; + var password = ''; + var inputs = form.getElementsByTagName('input'); + for (var i = 0; i < inputs.length; ++i) { + var input = inputs[i]; + var type = input.type.toLowerCase(); + if (type != 'text' && type != 'password' && + type != 'email') + continue; + if (!password && type == 'password') + password = input.value; + data += encodeURIComponent(input.name); + data += '='; + data += encodeURIComponent(input.value); + data += '&'; } - - function registerForm(form) { - form.addEventListener('submit', function() { - var form = this; - var data = ''; - var password = ''; - var inputs = form.getElementsByTagName('input'); - for (var i = 0; i < inputs.length; ++i) { - var input = inputs[i]; - var type = input.type.toLowerCase(); - if (type != 'text' && type != 'password' && - type != 'email') - continue; - if (!password && type == 'password') - password = input.value; - data += encodeURIComponent(input.name); - data += '='; - data += encodeURIComponent(input.value); - data += '&'; - } - if (!password) - return; - data = data.substring(0, data.length - 1); - var url = window.location.href; - var username = findUsername(inputs); - external.passwordManager.formSubmitted( - url, username, password, data); - }, true); - } - - for (var i = 0; i < document.forms.length; ++i) - registerForm(document.forms[i]); - - var observer = new MutationObserver(function(mutations) { - for (var i = 0; i < mutations.length; ++i) - for (var j = 0; j < mutations[i].addedNodes.length; ++j) - if (mutations[i].addedNodes[j].tagName == 'FORM') - registerForm(mutations[i].addedNodes[j]); - }); - observer.observe(document.documentElement, { - childList: true, subtree: true - }); - - })()""" + if (!password) + return; + data = data.substring(0, data.length - 1); + var url = window.location.href; + var username = findUsername(inputs); + external.passwordManager.formSubmitted( + url, username, password, data); + }, true); + } + + for (var i = 0; i < document.forms.length; ++i) + registerForm(document.forms[i]); + + var observer = new MutationObserver(function(mutations) { + for (var i = 0; i < mutations.length; ++i) + for (var j = 0; j < mutations[i].addedNodes.length; ++j) + if (mutations[i].addedNodes[j].tagName == 'FORM') + registerForm(mutations[i].addedNodes[j]); + }); + observer.observe(document.documentElement, { + childList: true, subtree: true + }); + +})()""" return source @@ -318,28 +326,28 @@ @rtype str """ source = """ - (function() {{ - var data = '{0}'.split('&'); - var inputs = document.getElementsByTagName('input'); - - for (var i = 0; i < data.length; ++i) {{ - var pair = data[i].split('='); - if (pair.length != 2) - continue; - var key = decodeURIComponent(pair[0]); - var val = decodeURIComponent(pair[1]); - for (var j = 0; j < inputs.length; ++j) {{ - var input = inputs[j]; - var type = input.type.toLowerCase(); - if (type != 'text' && type != 'password' && - type != 'email') - continue; - if (input.name == key) - input.value = val; - }} - }} - - }})()""" +(function() {{ + var data = '{0}'.split('&'); + var inputs = document.getElementsByTagName('input'); + + for (var i = 0; i < data.length; ++i) {{ + var pair = data[i].split('='); + if (pair.length != 2) + continue; + var key = decodeURIComponent(pair[0]); + var val = decodeURIComponent(pair[1]); + for (var j = 0; j < inputs.length; ++j) {{ + var input = inputs[j]; + var type = input.type.toLowerCase(); + if (type != 'text' && type != 'password' && + type != 'email') + continue; + if (input.name == key) + input.value = val; + }} + }} + +}})()""" data = bytes(data).decode("utf-8") data = data.replace("'", "\\'") @@ -356,12 +364,12 @@ @rtype str """ source = """ - (function() {{ - var css = document.createElement('style'); - css.setAttribute('type', 'text/css'); - css.appendChild(document.createTextNode('{0}')); - document.getElementsByTagName('head')[0].appendChild(css); - }})()""" +(function() {{ + var css = document.createElement('style'); + css.setAttribute('type', 'text/css'); + css.appendChild(document.createTextNode('{0}')); + document.getElementsByTagName('head')[0].appendChild(css); + }})()""" style = css.replace("'", "\\'").replace("\n", "\\n") return source.format(style) @@ -378,22 +386,22 @@ @rtype str """ source = """ - (function() { - var out = []; - var links = document.getElementsByTagName('link'); - for (var i = 0; i < links.length; ++i) { - var e = links[i]; - if ((e.rel == 'alternate') && - ((e.type == 'application/atom+xml') || - (e.type == 'application/rss+xml') - ) - ) { - out.push({ - url: e.getAttribute('href'), - title: e.getAttribute('title') - }); - } - } - return out; - })()""" +(function() { + var out = []; + var links = document.getElementsByTagName('link'); + for (var i = 0; i < links.length; ++i) { + var e = links[i]; + if ((e.rel == 'alternate') && + ((e.type == 'application/atom+xml') || + (e.type == 'application/rss+xml') + ) + ) { + out.push({ + url: e.getAttribute('href'), + title: e.getAttribute('title') + }); + } + } + return out; +})()""" return source