Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature/go_back_app #1

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
218 changes: 121 additions & 97 deletions www/themeablebrowser.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,117 +17,141 @@
* specific language governing permissions and limitations
* under the License.
*
*/
*/

var exec = require('cordova/exec');
var channel = require('cordova/channel');
var modulemapper = require('cordova/modulemapper');
var urlutil = require('cordova/urlutil');
var exec = require("cordova/exec");
var channel = require("cordova/channel");
var modulemapper = require("cordova/modulemapper");
var urlutil = require("cordova/urlutil");

function ThemeableBrowser() {
this.channels = {
'loadstart': channel.create('loadstart'),
'loadstop' : channel.create('loadstop'),
'loaderror' : channel.create('loaderror'),
'exit' : channel.create('exit'),
'message' : channel.create('message')
};
this.channels = {
loadstart: channel.create("loadstart"),
loadstop: channel.create("loadstop"),
loaderror: channel.create("loaderror"),
exit: channel.create("exit"),
message: channel.create("message"),
};
}

ThemeableBrowser.prototype = {
_eventHandler: function (event) {
if (event && (event.type in this.channels)) {
this.channels[event.type].fire(event);
}
},
close: function (eventname) {
exec(null, null, 'ThemeableBrowser', 'close', []);
return this;
},
show: function (eventname) {
exec(null, null, 'ThemeableBrowser', 'show', []);
return this;
},
hide: function (eventname) {
exec(null, null, 'ThemeableBrowser', 'hide', []);
return this;
},
reload: function (eventname) {
exec(null, null, 'ThemeableBrowser', 'reload', []);
return this;
},
addEventListener: function (eventname,f) {
if (!(eventname in this.channels)) {
this.channels[eventname] = channel.create(eventname);
}
this.channels[eventname].subscribe(f);
return this;
},
removeEventListener: function(eventname, f) {
if (eventname in this.channels) {
this.channels[eventname].unsubscribe(f);
}
return this;
},

executeScript: function(injectDetails, cb) {
if (injectDetails.code) {
exec(cb, null, 'ThemeableBrowser', 'injectScriptCode', [injectDetails.code, !!cb]);
} else if (injectDetails.file) {
exec(cb, null, 'ThemeableBrowser', 'injectScriptFile', [injectDetails.file, !!cb]);
} else {
throw new Error('executeScript requires exactly one of code or file to be specified');
}
return this;
},
_eventHandler: function (event) {
if (event && event.type in this.channels) {
this.channels[event.type].fire(event);
}
},
close: function (eventname) {
exec(null, null, "ThemeableBrowser", "close", []);
return this;
},
show: function (eventname) {
exec(null, null, "ThemeableBrowser", "show", []);
return this;
},
hide: function (eventname) {
exec(null, null, "ThemeableBrowser", "hide", []);
return this;
},
reload: function (eventname) {
exec(null, null, "ThemeableBrowser", "reload", []);
return this;
},
addEventListener: function (eventname, f) {
if (!(eventname in this.channels)) {
this.channels[eventname] = channel.create(eventname);
}
this.channels[eventname].subscribe(f);
return this;
},
removeEventListener: function (eventname, f) {
if (eventname in this.channels) {
this.channels[eventname].unsubscribe(f);
}
return this;
},

insertCSS: function(injectDetails, cb) {
if (injectDetails.code) {
exec(cb, null, 'ThemeableBrowser', 'injectStyleCode', [injectDetails.code, !!cb]);
} else if (injectDetails.file) {
exec(cb, null, 'ThemeableBrowser', 'injectStyleFile', [injectDetails.file, !!cb]);
} else {
throw new Error('insertCSS requires exactly one of code or file to be specified');
}
return this;
},
executeScript: function (injectDetails, cb) {
if (injectDetails.code) {
exec(cb, null, "ThemeableBrowser", "injectScriptCode", [
injectDetails.code,
!!cb,
]);
} else if (injectDetails.file) {
exec(cb, null, "ThemeableBrowser", "injectScriptFile", [
injectDetails.file,
!!cb,
]);
} else {
throw new Error(
"executeScript requires exactly one of code or file to be specified"
);
}
return this;
},

changeButtonImage: function(buttonIndex, buttonProps){
exec(null, null, 'ThemeableBrowser', 'changeButtonImage', [buttonIndex, buttonProps]);
insertCSS: function (injectDetails, cb) {
if (injectDetails.code) {
exec(cb, null, "ThemeableBrowser", "injectStyleCode", [
injectDetails.code,
!!cb,
]);
} else if (injectDetails.file) {
exec(cb, null, "ThemeableBrowser", "injectStyleFile", [
injectDetails.file,
!!cb,
]);
} else {
throw new Error(
"insertCSS requires exactly one of code or file to be specified"
);
}
return this;
},

changeButtonImage: function (buttonIndex, buttonProps) {
exec(null, null, "ThemeableBrowser", "changeButtonImage", [
buttonIndex,
buttonProps,
]);
},
};

exports.open = function(strUrl, strWindowName, strWindowFeatures, callbacks) {
// Don't catch calls that write to existing frames (e.g. named iframes).
if (window.frames && window.frames[strWindowName]) {
var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
return origOpenFunc.apply(window, arguments);
}
exports.open = function (strUrl, strWindowName, strWindowFeatures, callbacks) {
// Don't catch calls that write to existing frames (e.g. named iframes).
if (window.frames && window.frames[strWindowName]) {
var origOpenFunc = modulemapper.getOriginalSymbol(window, "open");
return origOpenFunc.apply(window, arguments);
}

strUrl = urlutil.makeAbsolute(strUrl);
var iab = new ThemeableBrowser();
strUrl = urlutil.makeAbsolute(strUrl);
var iab = new ThemeableBrowser();

callbacks = callbacks || {};
for (var callbackName in callbacks) {
iab.addEventListener(callbackName, callbacks[callbackName]);
}
callbacks = callbacks || {};
for (var callbackName in callbacks) {
iab.addEventListener(callbackName, callbacks[callbackName]);
}

var cb = function (eventname) {
iab._eventHandler(eventname);
};

var cb = function(eventname) {
iab._eventHandler(eventname);
};
strWindowFeatures = strWindowFeatures && JSON.stringify(strWindowFeatures);
// Slightly delay the actual native call to give the user a chance to
// register event listeners first, otherwise some warnings or errors may be missed.
setTimeout(function () {
exec(cb, cb, "ThemeableBrowser", "open", [
strUrl,
strWindowName,
strWindowFeatures || "",
]);
}, 0);

strWindowFeatures = strWindowFeatures && JSON.stringify(strWindowFeatures);
// Slightly delay the actual native call to give the user a chance to
// register event listeners first, otherwise some warnings or errors may be missed.
setTimeout(function() {
exec(cb, cb, 'ThemeableBrowser', 'open', [strUrl, strWindowName, strWindowFeatures || '']);
}, 0);
return iab;
return iab;
};

exports.EVT_ERR = 'ThemeableBrowserError';
exports.EVT_WRN = 'ThemeableBrowserWarning';
exports.ERR_CRITICAL = 'critical';
exports.ERR_LOADFAIL = 'loadfail';
exports.WRN_UNEXPECTED = 'unexpected';
exports.WRN_UNDEFINED = 'undefined';
exports.EVT_ERR = "ThemeableBrowserError";
exports.EVT_WRN = "ThemeableBrowserWarning";
exports.ERR_CRITICAL = "critical";
exports.ERR_LOADFAIL = "loadfail";
exports.WRN_UNEXPECTED = "unexpected";
exports.WRN_UNDEFINED = "undefined";