Source: views/html/WindowWaiter.js

/**
 * Waiter to handle events related to the window object.
 *
 * @author n1474335 [n1474335@gmail.com]
 * @copyright Crown Copyright 2016
 * @license Apache-2.0
 *
 * @constructor
 * @param {HTMLApp} app - The main view object for CyberChef.
 */
var WindowWaiter = function(app) {
    this.app = app;
};


/**
 * Handler for window resize events.
 * Resets the layout of CyberChef's panes after 200ms (so that continuous resizing doesn't cause
 * continuous resetting).
 */
WindowWaiter.prototype.window_resize = function() {
    clearTimeout(this.reset_layout_timeout);
    this.reset_layout_timeout = setTimeout(this.app.reset_layout.bind(this.app), 200);
};


/**
 * Handler for window blur events.
 * Saves the current time so that we can calculate how long the window was unfocussed for when
 * focus is returned.
 */
WindowWaiter.prototype.window_blur = function() {
    this.window_blur_time = new Date().getTime();
};


/**
 * Handler for window focus events.
 *
 * When a browser tab is unfocused and the browser has to run lots of dynamic content in other
 * tabs, it swaps out the memory for that tab.
 * If the CyberChef tab has been unfocused for more than a minute, we run a silent bake which will
 * force the browser to load and cache all the relevant JavaScript code needed to do a real bake.
 * This will stop baking taking a long time when the CyberChef browser tab has been unfocused for
 * a long time and the browser has swapped out all its memory.
 */
WindowWaiter.prototype.window_focus = function() {
    var unfocused_time = new Date().getTime() - this.window_blur_time;
    if (unfocused_time > 60000) {
        this.app.silent_bake();
    }
};