24#include <QtWebEngineWidgetsVersion>
28 QString source =
QL1S(
"(function() {"
31 "function registerExternal(e) {"
32 " window.external = e;"
33 " if (window.external) {"
34 " var event = document.createEvent('Event');"
35 " event.initEvent('_falkon_external_created', true, true);"
36 " window._falkon_external = true;"
37 " document.dispatchEvent(event);"
42 " if (top._falkon_external)"
43 " registerExternal(top.external);"
45 " top.document.addEventListener('_falkon_external_created', function() {"
46 " registerExternal(top.external);"
51 "function registerWebChannel() {"
53 " new QWebChannel(qt.webChannelTransport, function(channel) {"
54 " var external = channel.objects.qz_object;"
55 " external.extra = {};"
56 " for (var key in channel.objects) {"
57 " if (key != 'qz_object' && key.startsWith('qz_')) {"
58 " external.extra[key.substr(3)] = channel.objects[key];"
61 " registerExternal(external);"
64 " setTimeout(registerWebChannel, 100);"
67 "registerWebChannel();"
76 QString source =
QL1S(
"(function() {"
77 " let eFormsOld = [],"
80 " function findUsername(inputs) {"
81 " let usernameNames = ['user', 'name', 'login'];"
83 " for (let i = 0; i < usernameNames.length; ++i) {"
84 " for (let j = 0; j < inputs.length; ++j)"
85 " if (inputs[j].type == 'text' && inputs[j].value.length && inputs[j].name.indexOf(usernameNames[i]) != -1)"
86 " return inputs[j].value;"
89 " for (let i = 0; i < inputs.length; ++i)"
90 " if (inputs[i].type == 'text' && inputs[i].value.length)"
91 " return inputs[i].value;"
93 " for (let i = 0; i < inputs.length; ++i)"
94 " if (inputs[i].type == 'email' && inputs[i].value.length)"
95 " return inputs[i].value;"
100 " function processForm(eForm) {"
102 " let password = '';"
103 " let inputs = eForm.getElementsByTagName('input');"
105 " for (let i = 0; i < inputs.length; ++i) {"
106 " let input = inputs[i];"
107 " let type = input.type.toLowerCase();"
108 " if (type != 'text' && type != 'password' && type != 'email')"
110 " if (!password && type == 'password')"
111 " password = input.value;"
112 " data += encodeURIComponent(input.name);"
114 " data += encodeURIComponent(input.value);"
121 " if (eFormsDone.every(e => e != eForm)) {"
122 " eFormsDone.push(eForm);"
127 " data = data.substring(0, data.length - 1);"
128 " let url = window.location.href;"
129 " let username = findUsername(inputs);"
130 " external.autoFill.formSubmitted(url, username, password, data);"
133 " function undoForm(eForm) {"
134 " let i = eFormsDone.indexOf(eForm);"
137 " eFormsDone.splice(i, 1);"
141 " function registerForm(eForm) {"
142 " let eInputs = eForm.getElementsByTagName('input');"
144 " eForm.addEventListener('submit', () => processForm(eForm), true);"
146 " for (let eInput of eInputs) {"
147 " let type = eInput.type.toLowerCase();"
149 " if (type == 'password') {"
150 " eInput.addEventListener('blur', () => processForm(eForm), true);"
151 " eInput.addEventListener('input', () => undoForm(eForm), true);"
152 " eInput.addEventListener('keydown', () => event.keyCode === 13 && processForm(eForm), true);"
157 " setInterval(() => {"
159 " let eFormsNew = Array.from(document.forms);"
161 " for (let eFormNew of eFormsNew) {"
162 " if (eFormsOld.every(e => e != eFormNew)) {"
163 " eFormsOld.push(eFormNew);"
164 " registerForm(eFormNew);"
177 QString source =
QL1S(
"(function() {"
179 "external.AddSearchProvider = function(url) {"
180 " window.location = 'falkon:AddSearchProvider?url=' + url;"
182 "external.IsSearchProviderInstalled = function(url) {"
183 " console.warn('NOT IMPLEMENTED: IsSearchProviderInstalled()');"
186 "window.external = external;");
187 source +=
QL1S(
"})()");
202 QString source =
QL1S(
"(function() {"
203 "var head = document.getElementsByTagName('head')[0];"
205 "var css = document.createElement('style');"
206 "css.setAttribute('type', 'text/css');"
207 "css.appendChild(document.createTextNode('%1'));"
208 "head.appendChild(css);"
212 style.replace(
QL1S(
"'"),
QL1S(
"\\'"));
213 style.replace(
QL1S(
"\n"),
QL1S(
"\\n"));
214 return source.arg(style);
219 QString source =
QL1S(
"(function() {"
220 "var form = document.createElement('form');"
221 "form.setAttribute('method', 'POST');"
222 "form.setAttribute('action', '%1');"
228 QString valueSource =
QL1S(
"val = document.createElement('input');"
229 "val.setAttribute('type', 'hidden');"
230 "val.setAttribute('name', '%1');"
231 "val.setAttribute('value', '%2');"
232 "form.appendChild(val);");
235 QUrlQuery query(QString::fromUtf8(data));
237 const auto &queryItems = query.queryItems(QUrl::FullyDecoded);
238 for (
int i = 0;
i < queryItems.size(); ++
i) {
239 const auto &pair = queryItems[
i];
240 QString
value = pair.first;
241 QString key = pair.second;
243 key.replace(
QL1S(
"'"),
QL1S(
"\\'"));
244 values.append(valueSource.arg(
value, key));
247 return source.arg(url.toString(), values);
252 QString source =
QL1S(
"(function() {"
253 "var data = '%1'.split('&');"
254 "var inputs = document.getElementsByTagName('input');"
256 "for (var i = 0; i < data.length; ++i) {"
257 " var pair = data[i].split('=');"
258 " if (pair.length != 2)"
260 " var key = decodeURIComponent(pair[0]);"
261 " var val = decodeURIComponent(pair[1]);"
262 " for (var j = 0; j < inputs.length; ++j) {"
263 " var input = inputs[j];"
264 " var type = input.type.toLowerCase();"
265 " if (type != 'text' && type != 'password' && type != 'email')"
267 " if (input.name == key && input.name != '') {"
268 " input.value = val;"
269 " input.dispatchEvent(new Event('change'));"
276 QString d = QString::fromUtf8(data);
278 return source.arg(d);
283 QString source =
QL1S(
"(function() {"
285 "var links = document.getElementsByTagName('link');"
286 "for (var i = 0; i < links.length; ++i) {"
288 " if (e.type == 'application/opensearchdescription+xml') {"
303 QString source =
QL1S(
"(function() {"
305 "var imgs = document.getElementsByTagName('img');"
306 "for (var i = 0; i < imgs.length; ++i) {"
321 QString source =
QL1S(
"(function() {"
323 "var meta = document.getElementsByTagName('meta');"
324 "for (var i = 0; i < meta.length; ++i) {"
327 " name: e.getAttribute('name'),"
328 " content: e.getAttribute('content'),"
329 " httpequiv: e.getAttribute('http-equiv')"
340 QString source =
QL1S(
"(function() {"
341 "var e = document.elementFromPoint(%1, %2);"
342 "if (!e || e.tagName.toLowerCase() != 'input')"
344 "var fe = e.parentElement;"
346 " if (fe.tagName.toLowerCase() == 'form')"
348 " fe = fe.parentElement;"
353 " method: fe.method.toLowerCase(),"
354 " action: fe.action,"
355 " inputName: e.name,"
358 "for (var i = 0; i < fe.length; ++i) {"
359 " var input = fe.elements[i];"
360 " res.inputs.push([input.name, input.value]);"
365 return source.arg(pos.x()).arg(pos.y());
370 QString source =
QL1S(
"(function() {"
371 "var e = document.getElementById(\"%1\");"
373 " var els = document.querySelectorAll(\"[name='%1']\");"
378 " e.scrollIntoView();"
381 return source.arg(anchor);
static QString completeFormData(const QByteArray &data)
static QString setupFormObserver()
static QString setCss(const QString &css)
static QString setupWindowObject()
static QString sendPostData(const QUrl &url, const QByteArray &data)
static QString scrollToAnchor(const QString &anchor)
static QString setupWebChannel()
static QString getFormData(const QPointF &pos)
static QString getAllMetaAttributes()
static QString getAllImages()
static QString getOpenSearchLinks()
static QString setupSpeedDial()
int value(const QColor &c)