diff --git a/plugin.xml b/plugin.xml index 8d27ab5..cf32c7c 100644 --- a/plugin.xml +++ b/plugin.xml @@ -106,6 +106,7 @@ + diff --git a/src/ubuntu/InAppBrowser.qml b/src/ubuntu/InAppBrowser.qml index 2d1af51..781e8a6 100644 --- a/src/ubuntu/InAppBrowser.qml +++ b/src/ubuntu/InAppBrowser.qml @@ -55,6 +55,19 @@ Rectangle { } } + property string usContext: "oxide://main-world/2" + + function executeJS(scId, code) { + var req = _view.rootFrame.sendMessage(usContext, "EXECUTE", {code: code}); + + req.onreply = function(response) { + var code = 'cordova.callback(' + scId + ', JSON.parse(\'' + JSON.stringify(response.result) + '\'))'; + console.warn(code); + cordova.javaScriptExecNeeded(code); + console.warn("RESP:" + JSON.stringify(response)); + }; + } + WebView { width: parent.width y: urlEntry.height @@ -64,5 +77,16 @@ Rectangle { onLoadingStateChanged: { root.exec("InAppBrowser", "loadFinished", [_view.loading]) } + context: WebContext { + id: webcontext + + userScripts: [ + UserScript { + context: usContext + emulateGreasemonkey: true + url: "InAppBrowser_escapeScript.js" + } + ] + } } } diff --git a/src/ubuntu/InAppBrowser_escapeScript.js b/src/ubuntu/InAppBrowser_escapeScript.js new file mode 100644 index 0000000..e1c0c6c --- /dev/null +++ b/src/ubuntu/InAppBrowser_escapeScript.js @@ -0,0 +1,8 @@ +oxide.addMessageHandler("EXECUTE", function(msg) { + var code = msg.args.code; + try { + msg.reply({result: eval(code)}); + } catch(e) { + msg.error("Code threw exception: \"" + e + "\""); + } +}); diff --git a/src/ubuntu/inappbrowser.cpp b/src/ubuntu/inappbrowser.cpp index 97be212..c5a9e64 100644 --- a/src/ubuntu/inappbrowser.cpp +++ b/src/ubuntu/inappbrowser.cpp @@ -45,10 +45,10 @@ function finishCreation() { \ } \ createObject()"; -const char EXIT_EVENT[] = "'exit'"; -const char LOADSTART_EVENT[] = "'loadstart'"; -const char LOADSTOP_EVENT[] = "'loadstop'"; -const char LOADERROR_EVENT[] = "'loaderror'"; +const char EXIT_EVENT[] = "{type: 'exit'}"; +const char LOADSTART_EVENT[] = "{type: 'loadstart'}"; +const char LOADSTOP_EVENT[] = "{type: 'loadstop'}"; +const char LOADERROR_EVENT[] = "{type: 'loaderror'}"; void Inappbrowser::open(int cb, int, const QString &url, const QString &, const QString &) { assert(_eventCb == 0); @@ -71,28 +71,33 @@ void Inappbrowser::close(int, int) { _eventCb = 0; } -void Inappbrowser::injectStyleFile(int, int, const QString&, bool) { - // TODO: - qCritical() << "unimplemented " << __PRETTY_FUNCTION__; +void Inappbrowser::injectStyleFile(int scId, int ecId, const QString& src, bool b) { + QString code("(function(d) { var c = d.createElement('link'); c.rel='stylesheet'; c.type='text/css'; c.href = %1; d.head.appendChild(c);})(document)"); + code = code.arg(CordovaInternal::format(src)); + + injectScriptCode(scId, ecId, code, b); } -void Inappbrowser::injectStyleCode(int, int, const QString&, bool) { - // TODO: - qCritical() << "unimplemented " << __PRETTY_FUNCTION__; +void Inappbrowser::injectStyleCode(int scId, int ecId, const QString& src, bool b) { + QString code("(function(d) { var c = d.createElement('style'); c.innerHTML = %1; d.body.appendChild(c); })(document)"); + code = code.arg(CordovaInternal::format(src)); + + injectScriptCode(scId, ecId, code, b); } -void Inappbrowser::injectScriptFile(int, int, const QString&, bool) { - // TODO: - qCritical() << "unimplemented " << __PRETTY_FUNCTION__; +void Inappbrowser::injectScriptFile(int scId, int ecId, const QString& src, bool b) { + QString code("(function(d) { var c = d.createElement('script'); c.src = %1; d.body.appendChild(c);})(document)"); + code = code.arg(CordovaInternal::format(src)); + + injectScriptCode(scId, ecId, code, b); } -void Inappbrowser::injectScriptCode(int, int, const QString&, bool) { - // TODO: - qCritical() << "unimplemented " << __PRETTY_FUNCTION__; +void Inappbrowser::injectScriptCode(int scId, int, const QString& code, bool) { + m_cordova->execQML(QString("CordovaWrapper.global.inappbrowser.executeJS(%2, %1)").arg(CordovaInternal::format(code)).arg(scId)); } void Inappbrowser::loadFinished(bool status) { - if (status) { + if (!status) { this->callbackWithoutRemove(_eventCb, LOADSTOP_EVENT); } else { this->callbackWithoutRemove(_eventCb, LOADSTART_EVENT);