241 value = value.replace("'", "\\'") |
241 value = value.replace("'", "\\'") |
242 name = name.replace("'", "\\'") |
242 name = name.replace("'", "\\'") |
243 values += valueSource.format(name, value) |
243 values += valueSource.format(name, value) |
244 |
244 |
245 return source.format(url.toString(), values) |
245 return source.format(url.toString(), values) |
|
246 |
|
247 |
|
248 def setupFormObserver(): |
|
249 """ |
|
250 Function generating a script to monitor a web form for user entries. |
|
251 |
|
252 @return script to monitor a web page |
|
253 @rtype str |
|
254 """ |
|
255 source = """ |
|
256 (function() { |
|
257 function findUsername(inputs) { |
|
258 for (var i = 0; i < inputs.length; ++i) |
|
259 if (inputs[i].type == 'text' && inputs[i].value.length && |
|
260 inputs[i].name.indexOf('user') != -1) |
|
261 return inputs[i].value; |
|
262 for (var i = 0; i < inputs.length; ++i) |
|
263 if (inputs[i].type == 'text' && inputs[i].value.length && |
|
264 inputs[i].name.indexOf('name') != -1) |
|
265 return inputs[i].value; |
|
266 for (var i = 0; i < inputs.length; ++i) |
|
267 if (inputs[i].type == 'text' && inputs[i].value.length) |
|
268 return inputs[i].value; |
|
269 for (var i = 0; i < inputs.length; ++i) |
|
270 if (inputs[i].type == 'email' && inputs[i].value.length) |
|
271 return inputs[i].value; |
|
272 return ''; |
|
273 } |
|
274 |
|
275 function registerForm(form) { |
|
276 form.addEventListener('submit', function() { |
|
277 var form = this; |
|
278 var data = ''; |
|
279 var password = ''; |
|
280 var inputs = form.getElementsByTagName('input'); |
|
281 for (var i = 0; i < inputs.length; ++i) { |
|
282 var input = inputs[i]; |
|
283 var type = input.type.toLowerCase(); |
|
284 if (type != 'text' && type != 'password' && |
|
285 type != 'email') |
|
286 continue; |
|
287 if (!password && type == 'password') |
|
288 password = input.value; |
|
289 data += encodeURIComponent(input.name); |
|
290 data += '='; |
|
291 data += encodeURIComponent(input.value); |
|
292 data += '&'; |
|
293 } |
|
294 if (!password) |
|
295 return; |
|
296 data = data.substring(0, data.length - 1); |
|
297 var url = window.location.href; |
|
298 var username = findUsername(inputs); |
|
299 external.autoFill.formSubmitted(url, username, password, |
|
300 data); |
|
301 }, true); |
|
302 } |
|
303 |
|
304 for (var i = 0; i < document.forms.length; ++i) |
|
305 registerForm(document.forms[i]); |
|
306 |
|
307 var observer = new MutationObserver(function(mutations) { |
|
308 for (var i = 0; i < mutations.length; ++i) |
|
309 for (var j = 0; j < mutations[i].addedNodes.length; ++j) |
|
310 if (mutations[i].addedNodes[j].tagName == 'form') |
|
311 registerForm(mutations[i].addedNodes[j]); |
|
312 }); |
|
313 observer.observe(document.documentElement, { childList: true }); |
|
314 |
|
315 })()""" |
|
316 return source |
|
317 |
|
318 |
|
319 def completeFormData(data): |
|
320 """ |
|
321 Function generating a script to fill in form data. |
|
322 |
|
323 @param data data to be filled into the form |
|
324 @type QByteArray |
|
325 @return script to fill a form |
|
326 @rtype str |
|
327 """ |
|
328 source = """ |
|
329 (function() {{ |
|
330 var data = '{0}'.split('&'); |
|
331 var inputs = document.getElementsByTagName('input'); |
|
332 |
|
333 for (var i = 0; i < data.length; ++i) {{ |
|
334 var pair = data[i].split('='); |
|
335 if (pair.length != 2) |
|
336 continue; |
|
337 var key = decodeURIComponent(pair[0]); |
|
338 var val = decodeURIComponent(pair[1]); |
|
339 for (var j = 0; j < inputs.length; ++j) {{ |
|
340 var input = inputs[j]; |
|
341 var type = input.type.toLowerCase(); |
|
342 if (type != 'text' && type != 'password' && |
|
343 type != 'email') |
|
344 continue; |
|
345 if (input.name == key) |
|
346 input.value = val; |
|
347 }} |
|
348 }} |
|
349 |
|
350 }})()""" |
|
351 |
|
352 data = bytes(data).decode("utf-8") |
|
353 data = data.replace("'", "\\'") |
|
354 return source.format(data) |