diff options
Diffstat (limited to 'webhelper')
-rw-r--r-- | webhelper/Makefile.am.inc | 10 | ||||
-rw-r--r-- | webhelper/webhelper.js | 86 |
2 files changed, 96 insertions, 0 deletions
diff --git a/webhelper/Makefile.am.inc b/webhelper/Makefile.am.inc new file mode 100644 index 0000000..f7b26b0 --- /dev/null +++ b/webhelper/Makefile.am.inc @@ -0,0 +1,10 @@ +# Copyright 2013 Endless Mobile, Inc. + +# # # INSTALL RULES # # # + +webhelper_sources = webhelper/webhelper.js + +webhelperdir = $(gjsmodulesdir) +dist_webhelper_DATA = \ + $(webhelper_sources) \ + $(NULL) diff --git a/webhelper/webhelper.js b/webhelper/webhelper.js new file mode 100644 index 0000000..8b78931 --- /dev/null +++ b/webhelper/webhelper.js @@ -0,0 +1,86 @@ +const Endless = imports.gi.Endless; +const GLib = imports.gi.GLib; +const Gtk = imports.gi.Gtk; +const WebKit = imports.gi.WebKit; + +const EOS_URI_SCHEME = 'endless://'; + + +const Application = new Lang.Class({ + Name: 'WebApplication', + Extends: Endless.Application, + +// Set of actions that may be invoked from a WebView. +// Declare them as function(dict), and use links with the format +// "endless://actionName?parameter=value" + + _webActions: { }, + +// This callback does the translation from URI to action +// this._webview.connect('navigation-policy-decision-requested', +// Lang.bind(this, this._webHelper.onNavigationRequested)); + + _onNavigationRequested : function(web_view, frame, request, + navigation_action, policy_decision, + user_data) { + let uri = request.get_uri(); + + if(uri.indexOf(EOS_URI_SCHEME) == 0) { + // get the name and parameters for the desired function + let f_call = uri.substring(EOS_URI_SCHEME.length, uri.length).split('?'); + var function_name = f_call[0]; + var parameters = {}; + + if(f_call[1]) { + // there are parameters + let params = f_call[1].split('&'); + params.forEach(function(entry) { + let param = entry.split('='); + + if(param.length == 2) { + param[0] = decodeURIComponent(param[0]); + param[1] = decodeURIComponent(param[1]); + // and now we add it... + parameters[param[0]] = param[1]; + } + }); + } + + if(this._webActions[function_name]) + Lang.bind(this, this._webActions[function_name])(parameters); + else + print('Unknown function '+function_name); + + policy_decision.ignore(); + return true; + } else { + // this is a regular URL, just navigate there + return false; + } + }, + +// convenience functions + + _getElementById: function(webview, id) { + // WebKit.DOMDocument + let dom = webview.get_dom_document(); + + // WebKit.DOMElement + return dom.get_element_by_id(id); + }, + + _translateHTML: function(webview, lang) { + let dom = webview.get_dom_document(); + + // WebKit.DOMNodeList + let translatable = dom.get_elements_by_name('translatable'); + + for (var i = 0 ; i < translatable.get_length() ; i++) { + // WebKit.DOMNode + let element = translatable.item(i); + + // TODO here is where we would do the translation + element.inner_html = '<i>' + element.inner_text + '</i>'; + } + } +}); |