BabylonJS/Spector.js

View on GitHub
extensions/popup.js

Summary

Maintainability
C
1 day
Test Coverage
//_______________________________EXTENSION POLYFILL_____________________________________
window.browser = (function () {
  return window.msBrowser ||
    window.browser ||
    window.chrome ||
    browser;
})();

function sendMessage(message) {
    try {
        window.browser.tabs.query({ active: true, currentWindow: true }, function(tabs) { 
            window.browser.tabs.sendMessage(tabs[0].id, message, function(response) { }); 
        });
    }
    catch (e) {
        // Tab has probably been closed.
    }
};
//_____________________________________________________________________________________

var ui = null;
var offScreenInput = null;

// Display the capture UI.
window.addEventListener("DOMContentLoaded", function() {
    var openCaptureFileElement = document.getElementById("openCaptureFile");
    openCaptureFileElement.addEventListener("dragenter", (e) => { this.drag(e); return false; }, false);
    openCaptureFileElement.addEventListener("dragover", (e) => { this.drag(e); return false; }, false);
    openCaptureFileElement.addEventListener("drop", (e) => { this.drop(e); }, false);

    var captureOnLoadElement = document.getElementById("captureOnLoad");
    var captureNowElement = document.getElementById("captureNow");
    var captureOnLoadCountInput = document.getElementById("captureOnLoadCount");
    var captureOnLoadTransientInput = document.getElementById("captureOnLoadTransient");
    var quickCaptureInput = document.getElementById("quickCapture");
    var fullCaptureInput = document.getElementById("fullCapture");
    offScreenInput = document.getElementById("offScreen");

    captureNowElement.addEventListener("click", (e) => {
        var commandCount = parseInt(captureOnLoadCountInput.value);
        if (commandCount < 0 || commandCount === Number.NaN) {
            commandCount = 500;
        }
        var quickCaptureInput = document.getElementById("quickCapture");
        var fullCaptureInput = document.getElementById("fullCapture");

        var canvasInfo = ui.getSelectedCanvasInformation();
        if (canvasInfo) {
            var canvasRef = canvasInfo.ref;
            this.captureNow(canvasRef, quickCaptureInput.checked, fullCaptureInput.checked, commandCount);
        }
        return false; 
    });

    captureOnLoadElement.addEventListener("click", (e) => { 
        var transient = captureOnLoadTransientInput.checked;
        var quickCapture = quickCaptureInput.checked;
        var fullCapture = fullCaptureInput.checked;
        var commandCount = parseInt(captureOnLoadCountInput.value);
        if (commandCount < 0 || commandCount === Number.NaN) {
            commandCount = 500;
        }
        this.captureonLoad(commandCount, transient, quickCapture, fullCapture); 
        return false; 
    });

    offScreenInput.onchange = () => {
        this.changeOffScreenStatus(offScreenInput.checked);
    };

    initUI();
    refreshCanvases();
    playAll();
});

var captureCanvas = function(e) {
    if (e) {
        var quickCaptureInput = document.getElementById("quickCapture");
        var fullCaptureInput = document.getElementById("fullCapture");
        var canvasRef = e.ref;

        captureNow(canvasRef, quickCaptureInput.checked, fullCaptureInput.checked, 0);
    }
}

var captureNow = function(canvasRef, quickCapture, fullCapture, commandCount) {
    sendMessage({ 
        action: "capture", 
        canvasRef: canvasRef,
        quickCapture: quickCapture,
        fullCapture: fullCapture,
        commandCount: commandCount
    });
}

var captureonLoad = function(commandCount, transient, quickCapture, fullCapture) {
    sendMessage({ 
        action: "captureOnLoad",
        commandCount : commandCount,
        transient: transient,
        quickCapture: quickCapture,
        fullCapture: fullCapture
    });
}

var changeOffScreenStatus = function(offScreen) {
    sendMessage({ 
        action: "changeOffScreen",
        captureOffScreen : offScreen,
    });
}

var drag = function(e) {
    e.stopPropagation();
    e.preventDefault();
}

var drop = function(eventDrop) {
    eventDrop.stopPropagation();
    eventDrop.preventDefault();

    this.loadFiles(eventDrop);
}

var loadFiles = function(event) {
    var filesToLoad = null;

    // Handling data transfer via drag'n'drop
    if (event && event.dataTransfer && event.dataTransfer.files) {
        filesToLoad = event.dataTransfer.files;
    }

    // Handling files from input files
    if (event && event.target && event.target.files) {
        filesToLoad = event.target.files;
    }

    // Load the files.
    if (filesToLoad && filesToLoad.length > 0) {
        for (let i = 0; i < filesToLoad.length; i++) {
            let name = filesToLoad[i].name.toLowerCase();
            let extension = name.split('.').pop();
            let type = filesToLoad[i].type;
            
            if (extension === "json") {
                const fileToLoad = filesToLoad[i];

                const reader = new FileReader();
                reader.onerror = e => {
                    console.error("Error while reading file: " + fileToLoad.name + e);
                };
                reader.onload = e => {
                    try {
                        window.browser.runtime.sendMessage({ capture: JSON.parse(e.target['result']) }, function(response) { });
                    }
                    catch (exception) {
                        console.error("Error while reading file: " + fileToLoad.name + exception);
                    }
                };
                reader.readAsText(fileToLoad);
            }
        }
    }
}

var initUI = function() {
    ui = new SPECTOR.EmbeddedFrontend.CaptureMenu();
    ui.onPlayRequested.add(this.play, this);
    ui.onPlayNextFrameRequested.add(this.playNextFrame, this);
    ui.onPauseRequested.add(this.pause, this);
    ui.onCaptureRequested.add(this.captureCanvas, this);
    ui.display();
}

var refreshCanvases = function() {
    window.browser.runtime.sendMessage({ refreshCanvases: true }, function(response) { });
}

var updateCanvasesListInformation = function (canvasesToSend) {
    ui.updateCanvasesListInformation(canvasesToSend.canvases);
    offScreenInput.checked = canvasesToSend.captureOffScreen;
}

var refreshFps = function(fps, frameId, tabId) {
    var canvasInfo = ui.getSelectedCanvasInformation();
    if (canvasInfo && canvasInfo.ref.tabId == tabId && canvasInfo.ref.frameId == frameId) {
        ui.setFPS(fps);
    }
}

var captureComplete = function(errorMessage) {
    ui.captureComplete(errorMessage);
}

var playAll = function() {
    sendMessage({ action: "playAll" });
} 

var play = function(e) {
    if (e) {     
        sendMessage({ action: "play", canvasRef: e.ref });
    }
} 

var playNextFrame = function(e) {
    if (e) {       
        sendMessage({ action: "playNextFrame", canvasRef: e.ref });
    }
} 

var pause = function(e) {
    if (e) {
        sendMessage({ action: "pause", canvasRef: e.ref });
    }
}