Matt DeKrey
Matt DeKrey

Reputation: 11942

InAppBrowser not closing?

I'm using the InAppBrowser plugin (v1.1.1) with Cordova for an OAuth login process. Unfortunately, the InAppBrowser doesn't appear to be closing the browser. My "closeBrowser" function instead continually triggers the interval, and the browser remains on-screen on the Android (I have not tried other devices at this time.)

Is there a way to forcibly close the InAppBrowser other than .close(), or hide it? Or maybe there's a flaw in my code somewhere that is locking the browser.

LogInPage.prototype.handleExternalLogin = function (externalLogin) {
    var _this = this;

    var ref = window.open(Environment_1.settings.baseUrl + externalLogin.route.url, "_blank", "location=no");
    ref.addEventListener('loadstart', function (event) {
        if (_.startsWith(event.url, Environment_1.settings.baseUrl + "/api/Account/account/ExternalLoginCallback")) {
            // Now we want to load a different url that will give us the mobile access token
            console.log('get external-mobile-token');
            _this.closeBrowser(ref);

            var ref2 = window.open(Environment_1.settings.baseUrl + "/api/Account/external-mobile-token", "_blank" /*, "location=no"*/);

            ref2.addEventListener('loadstop', function (event) {
                console.log('loadstop ' + event.url);
                if (event.url == Environment_1.settings.baseUrl + "/api/Account/external-mobile-token") {
                    ref2.executeScript({ code: 'window.document.documentElement.innerText' }, function (contents) {
                        _this.login(contents);
                        _this.closeBrowser(ref2);
                    });
                }
            });

            ref2.addEventListener('loaderror', function (event) {
                console.log(event);
                _this.closeBrowser(ref2);
                // TODO - do something?
            });
        }
    });

    ref.addEventListener('loaderror', function (event) {
        console.log(event);
        _this.closeBrowser(ref);
        // TODO - do something?
    });
};

LogInPage.prototype.closeBrowser = function (browser) {
    var interval = setInterval(function () {
        console.log('closing');
        browser.close();
    }, 10);

    browser.addEventListener('exit', function () {
        console.log('closed');
        clearInterval(interval);
    });
};

LogInPage.prototype.login = function (token) {
    console.log(token);
};

The above code is actually generated from TypeScript, but I figured I wouldn't confuse the issue.

Upvotes: 0

Views: 495

Answers (1)

Matt DeKrey
Matt DeKrey

Reputation: 11942

It appears that closing an InAppBrowser and opening another at the same time was causing the issue; rewriting the process to only need one window solved my issue.

Upvotes: 1

Related Questions