function init() {
        if (api.initialized) {
            return;
        }
        var testRange;
        var implementsDomRange = false, implementsTextRange = false;

        // First, perform basic feature tests

        if (isHostMethod(document, "createRange")) {
            testRange = document.createRange();
            if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {
                implementsDomRange = true;
            }
            testRange.detach();
        }

        var body = isHostObject(document, "body") ? document.body : document.getElementsByTagName("body")[0];

        if (body && isHostMethod(body, "createTextRange")) {
            testRange = body.createTextRange();
            if (isTextRange(testRange)) {
                implementsTextRange = true;
            }
        }

        if (!implementsDomRange && !implementsTextRange) {
            fail("Neither Range nor TextRange are implemented");
        }

        api.initialized = true;
        api.features = {
            implementsDomRange: implementsDomRange,
            implementsTextRange: implementsTextRange
        };

        // Initialize modules and call init listeners
        var allListeners = moduleInitializers.concat(initListeners);
        for (var i = 0, len = allListeners.length; i < len; ++i) {
            try {
                allListeners[i](api);
            } catch (ex) {
                if (isHostObject(window, "console") && isHostMethod(window.console, "log")) {
                    window.console.log("Init listener threw an exception. Continuing.", ex);
                }

            }
        }
    }
function init() {
        if (api.initialized) {
            return;
        }
        var testRange;
        var implementsDomRange = false, implementsTextRange = false;

        

        if (isHostMethod(document, "createRange")) {
            testRange = document.createRange();
            if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {
                implementsDomRange = true;
            }
            testRange.detach();
        }

        var body = isHostObject(document, "body") ? document.body : document.getElementsByTagName("body")[0];

        if (body && isHostMethod(body, "createTextRange")) {
            testRange = body.createTextRange();
            if (isTextRange(testRange)) {
                implementsTextRange = true;
            }
        }

        if (!implementsDomRange && !implementsTextRange) {
            fail("Neither Range nor TextRange are implemented");
        }

        api.initialized = true;
        api.features = {
            implementsDomRange: implementsDomRange,
            implementsTextRange: implementsTextRange
        };

        
        var allListeners = moduleInitializers.concat(initListeners);
        for (var i = 0, len = allListeners.length; i < len; ++i) {
            try {
                allListeners[i](api);
            } catch (ex) {
                if (isHostObject(window, "console") && isHostMethod(window.console, "log")) {
                    window.console.log("Init listener threw an exception. Continuing.", ex);
                }

            }
        }
    }
function init ( ) { if ( api . initialized ) { return ; } var testRange ; var implementsDomRange = false , implementsTextRange = false ; // First, perform basic feature tests if ( isHostMethod ( document , "createRange" ) ) { testRange = document . createRange ( ) ; if ( areHostMethods ( testRange , domRangeMethods ) && areHostProperties ( testRange , domRangeProperties ) ) { implementsDomRange = true ; } testRange . detach ( ) ; } var body = isHostObject ( document , "body" ) ? document . body : document . getElementsByTagName ( "body" ) [ 0 ] ; if ( body && isHostMethod ( body , "createTextRange" ) ) { testRange = body . createTextRange ( ) ; if ( isTextRange ( testRange ) ) { implementsTextRange = true ; } } if ( ! implementsDomRange && ! implementsTextRange ) { fail ( "Neither Range nor TextRange are implemented" ) ; } api . initialized = true ; api . features = { implementsDomRange : implementsDomRange , implementsTextRange : implementsTextRange } ; // Initialize modules and call init listeners var allListeners = moduleInitializers . concat ( initListeners ) ; for ( var i = 0 , len = allListeners . length ; i < len ; ++ i ) { try { allListeners [ i ] ( api ) ; } catch ( ex ) { if ( isHostObject ( window , "console" ) && isHostMethod ( window . console , "log" ) ) { window . console . log ( "Init listener threw an exception. Continuing." , ex ) ; } } } }
Initialization
Initialization