Skip to content

Commit

Permalink
Delay suspends on some WebApp suspends v3 (#2248)
Browse files Browse the repository at this point in the history
  • Loading branch information
comcastmike authored Mar 31, 2020
1 parent 2d9f639 commit a961d71
Showing 1 changed file with 129 additions and 3 deletions.
132 changes: 129 additions & 3 deletions examples/pxScene2d/src/rcvrcore/optimus.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,16 @@ limitations under the License.
var applicationsArray = [];
var availableApplicationsArray = [];
var eventListenerHash = {};
var html5_suspend_whitelist = [];
var html5_suspend_delay_seconds = 5;

var scene;
var root;
var appManager = new Optimus();
module.exports = appManager;

var node_url = require('url');

var ApplicationType = Object.freeze({
SPARK:"SPARK",
SPARK_INSTANCE:"SPARK_INSTANCE",
Expand Down Expand Up @@ -205,6 +209,7 @@ function Application(props) {
var userAgent = null;
var localStorage = false;
var appParent = null;
var suspendDelayTimeout = null;

// Internal function needed for suspend
var do_suspend_internal = function(o)
Expand All @@ -220,8 +225,33 @@ function Application(props) {
}
if (_this.type === ApplicationType.WEB){
if (_browser !== undefined && _browser.suspend){
_this.log("Suspending Web app");
_browser.suspend();
_this.log("Suspending Web app");

if (_this.urlDelaysSuspend(_this.api().url) && html5_suspend_delay_seconds >= 1)
{
_this.log("delaying suspend and setting visibility to hidden");
_this.api().visibility = 'hidden';

if(suspendDelayTimeout != null)
{
_this.log("WARNING! suspendDelayTimeout already set, canceling and restarting anew");
clearTimeout(suspendDelayTimeout);
suspendDelayTimeout = null;
}

suspendDelayTimeout = setTimeout(function ()
{
_this.log("doing delayed suspend now");
_browser.suspend();
suspendDelayTimeout = null;
}, html5_suspend_delay_seconds * 1000);
}
else
{
_this.log("suspending immediately");
_browser.suspend();
}

_state = ApplicationState.SUSPENDED;
_this.applicationSuspended();
return true;
Expand Down Expand Up @@ -328,7 +358,15 @@ function Application(props) {
}
if (this.type === ApplicationType.WEB){
if (_browser !== undefined && _browser.resume){
this.log("Resuming Web app");
this.log("Resuming Web app");

if(suspendDelayTimeout != null)
{
_this.log("suspendDelayTimeout set, canceling");
clearTimeout(suspendDelayTimeout);
suspendDelayTimeout = null;
}

_browser.resume();
_state = ApplicationState.RUNNING;
this.applicationResumed();
Expand Down Expand Up @@ -374,6 +412,14 @@ function Application(props) {
}
try {
this.log("about to destroy");

if(suspendDelayTimeout != null)
{
_this.log("suspendDelayTimeout set, canceling");
clearTimeout(suspendDelayTimeout);
suspendDelayTimeout = null;
}

if (_externalApp.destroy) {
ret = _externalApp.destroy();
} else if (this.type === ApplicationType.SPARK && _externalApp.api && _externalApp.api.destroy) {
Expand Down Expand Up @@ -426,6 +472,18 @@ function Application(props) {
_externalApp.parent = p;
}
};
// Check if a link would have a delayed suspend
this.urlDelaysSuspend = function(url_val)
{
var parsedURL = node_url.parse(url_val);
var url_hostname = parsedURL.hostname;

for(var i=0;i<html5_suspend_whitelist.length;i++)
if (url_hostname.toLowerCase().indexOf(html5_suspend_whitelist[i]) != -1)
return true;

return false;
};
// takes a screenshot of the application
this.screenshot = function(mimeType) {
if (_externalApp && _externalApp.screenshot && typeof _externalApp.screenshot === "function"){
Expand Down Expand Up @@ -998,4 +1056,72 @@ function Optimus() {

return i.toString();
};

function loadHTML5SuspendWhitelist()
{
//OPTIMUS_HTML5_DELAY_SUSPEND_FILE not set?
if(typeof(process.env.OPTIMUS_HTML5_DELAY_SUSPEND_FILE) == "undefined")
{
console.log("OPTIMUS_HTML5_DELAY_SUSPEND_FILE undefined. Not loading HTML5 Delay Suspend Whitelist.");
return;
}

//set / read whitelist
try
{
html5_suspend_whitelist = require(process.env.OPTIMUS_HTML5_DELAY_SUSPEND_FILE);
}
catch(err)
{
console.log("loading html5_suspend_whitelist with '" + process.env.OPTIMUS_HTML5_DELAY_SUSPEND_FILE + "' failed with error '" + err.message + "'");
}

//set delay in seconds
{
var default_html5_suspend_delay_seconds = html5_suspend_delay_seconds;

if(typeof(process.env.OPTIMUS_HTML5_DELAY_SUSPEND_SECONDS) == "number")
html5_suspend_delay_seconds = process.env.OPTIMUS_HTML5_DELAY_SUSPEND_SECONDS;
if(typeof(process.env.OPTIMUS_HTML5_DELAY_SUSPEND_SECONDS) == "string")
html5_suspend_delay_seconds = Number(process.env.OPTIMUS_HTML5_DELAY_SUSPEND_SECONDS);
else
console.log("OPTIMUS_HTML5_DELAY_SUSPEND_SECONDS is undefined. Will use default time of " + html5_suspend_delay_seconds);

//check if nan
if(isNaN(html5_suspend_delay_seconds))
{
console.log("html5_suspend_whitelist_delay_in_seconds was NaN. Possibly bad OPTIMUS_HTML5_DELAY_SUSPEND_SECONDS string?");
html5_suspend_delay_seconds = default_html5_suspend_delay_seconds;
}

//disable suspend delay?
if(html5_suspend_delay_seconds < 1)
{
console.log("html5_suspend_whitelist_delay_in_seconds set to less than 1, disabling html5 delay suspend.");
html5_suspend_delay_seconds = 0;
}
}

console.log("html5_suspend_whitelist loaded:");
console.log(html5_suspend_whitelist);
console.log("html5_suspend_whitelist_delay_in_seconds: " + html5_suspend_delay_seconds);
}

function checkLoadHTML5SuspendWhitelist()
{
if(process.env.OPTIMUS_HTML5_DELAY_SUSPEND === "true")
{
console.log("OPTIMUS_HTML5_DELAY_SUSPEND set to true. Loading HTML5 Delay Suspend Whitelist file.");
loadHTML5SuspendWhitelist();
}
else if(process.env.OPTIMUS_HTML5_DELAY_SUSPEND === "false")
console.log("OPTIMUS_HTML5_DELAY_SUSPEND set to false. Not loading HTML5 Delay Suspend Whitelist file.");
else if(typeof(process.env.OPTIMUS_HTML5_DELAY_SUSPEND) == "undefined")
{
console.log("OPTIMUS_HTML5_DELAY_SUSPEND undefined. Defaulting to loading HTML5 Delay Suspend Whitelist file.");
loadHTML5SuspendWhitelist();
}
}

checkLoadHTML5SuspendWhitelist();
}

0 comments on commit a961d71

Please sign in to comment.