flaw-window/src/flaw-window.js

Summary

Maintainability
A
3 hrs
Test Coverage
// init canvas
function h$flaw_window_init_canvas() {

    // create canvas
    var canvas = document.createElement('canvas');

    // set styles to be full-window
    canvas.style.position = 'absolute';
    canvas.style.left = 0;
    canvas.style.top = 0;
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;

    // add canvas to page
    // try to add to container
    var container = document.getElementById('flaw_window_container');
    if(container) {
        container.appendChild(canvas);
    } else {
        document.body.appendChild(canvas);
        document.body.style.overflow = 'hidden';
    }

    // ensure canvas is always full-window
    window.addEventListener('resize', function() {
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
    }, false);

    // state of mouse lock
    var mouseLock = false;
    // method to set mouse lock
    canvas.flaw_window_set_mouse_lock = function(newMouseLock) {
        if(mouseLock == newMouseLock) return;
        mouseLock = newMouseLock;
        if(mouseLock) setPointerLock();
        else resetPointerLock();
    };
    function setPointerLock() {
        canvas.requestPointerLock();
    }
    function resetPointerLock() {
        document.exitPointerLock();
    }

    // check pointer lock on mousedown
    canvas.addEventListener('mousedown', function(e) {
        // only trying to set pointer lock, not reset, and only if needed
        if(mouseLock && h$flaw_window_pointerLockElement !== canvas) {
            setPointerLock();
        }
    }, false);

    // method to set full screen
    canvas.flaw_window_set_fullscreen = function(fullscreen) {
        if(fullscreen != (h$flaw_window_fullscreenElement === canvas)) {
            if(fullscreen) canvas.requestFullscreen();
            else document.cancelFullscreen();
        }
    };

    // fixup canvas methods
    h$flaw_js_vendor_fixup_method(canvas, 'requestPointerLock');

    h$flaw_js_vendor_fixup_method(canvas, 'requestFullscreen');
    h$flaw_js_vendor_fixup_method(canvas, 'requestFullScreen');
    if(!canvas.requestFullscreen) canvas.requestFullscreen = canvas.requestFullScreen;

    return canvas;
}

// fixup document methods
h$flaw_js_vendor_fixup_method(document, 'exitPointerLock');

h$flaw_js_vendor_fixup_method(document, 'cancelFullscreen');
h$flaw_js_vendor_fixup_method(document, 'cancelFullScreen');
if(!document.cancelFullscreen) document.cancelFullscreen = document.cancelFullScreen;

// currently pointer-locked element
var h$flaw_window_pointerLockElement = null;
h$flaw_js_vendor_fixup_addEventListener(document, 'pointerlockchange', function() {
    h$flaw_window_pointerLockElement = h$flaw_js_vendor_fixup_read(document, 'pointerLockElement');
}, false);

// currently full-screened element
var h$flaw_window_fullscreenElement = null;
h$flaw_js_vendor_fixup_addEventListener(document, 'fullscreenchange', function() {
    h$flaw_window_fullscreenElement = h$flaw_js_vendor_fixup_read(document, 'fullscreenElement') || h$flaw_js_vendor_fixup_read(document, 'fullScreenElement');
}, false);