Skip to content

Commit 4e33931

Browse files
committed
removeEventListener was not working because 2nd parameter was not original function set on addEventListener
See https://issues.apache.org/jira/browse/CB-4819 extracted functions used for events so that removeEventListener would work as expected Original issue: nraboy#139
1 parent 81f3f51 commit 4e33931

File tree

1 file changed

+83
-59
lines changed

1 file changed

+83
-59
lines changed

dist/ng-cordova-oauth.js

+83-59
Original file line numberDiff line numberDiff line change
@@ -683,15 +683,78 @@ function google($q, $http, $cordovaOauthUtility) {
683683

684684
var browserRef, deferred = $q.defer();
685685

686+
686687
// ------------- local funcions ----------------
687688
function cleanUp() {
688-
if (browserRef) {
689-
browserRef.removeEventListener("exit",function(event){});
690-
browserRef.removeEventListener("loadstart",function(event){});
691-
browserRef.removeEventListener("loadstop",function(event){});
692-
browserRef.close();
693-
}
689+
if (browserRef) {
690+
browserRef.removeEventListener("exit", exitFn);
691+
browserRef.removeEventListener("loadstart", loadstartFn);
692+
browserRef.removeEventListener("loadstop", loadstopFn);
693+
browserRef.removeEventListener("loaderror", loaderrorFn);
694+
browserRef.close();
695+
}
694696
}
697+
/*
698+
we need to declare functions used for events so that we can remove the listeners later
699+
see: https://issues.apache.org/jira/browse/CB-4819
700+
*/
701+
702+
/* loadstartFn()
703+
this hooks into browser new pages to test if the proccess of authentication have reached its end (loading redirect_uri)
704+
so that it can grab redirect_uri query string to capture token
705+
also, closes the browser in order to get back to app
706+
*/
707+
function loadstartFn(event) {
708+
if((event.url).indexOf(redirect_uri) === 0) { //if new URL begins with redirect_uri
709+
cleanUp();
710+
//generates object from query string
711+
var callbackResponse = (event.url).split("#")[1];
712+
var responseParameters = (callbackResponse).split("&");
713+
var parameterMap = [];
714+
for(var i = 0; i < responseParameters.length; i++) {
715+
parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
716+
}
717+
if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
718+
deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, expires_in: parameterMap.expires_in });
719+
} else {
720+
deferred.reject("Problem authenticating");
721+
}
722+
}
723+
}
724+
725+
/* loadstopFn()
726+
just show the browser on first page loaded and remove itself
727+
*/
728+
function loadstopFn(event) {
729+
730+
browserRef.show();
731+
browserRef.removeEventListener("loadstop", loadstopFn);
732+
733+
}
734+
/* loaderrorFn()
735+
if something goes wrong, do the cleanup and get back to the app
736+
rejects the promise
737+
*/
738+
function loaderrorFn(event) {
739+
if((event.url).indexOf(redirect_uri) === 0) {
740+
return; // nothing to do here, this error is expected. 'loadstart' event will treat it.
741+
}
742+
//something went wrong, so, let's cleanup
743+
cleanUp();
744+
745+
deferred.reject("Problem authenticating (loaderror)"); //and get back to the app with an error
746+
console.log("inAppBrowser loaderror => event: ", JSON.stringify(event) );
747+
748+
}
749+
/* exitFn()
750+
User cancelled browser
751+
rejects promise
752+
*/
753+
function exitFn() {
754+
deferred.reject("The sign in flow was canceled");
755+
}
756+
757+
// ------------- end of local funcions ----------------
695758

696759
if(window.cordova) {
697760

@@ -727,66 +790,27 @@ function google($q, $http, $cordovaOauthUtility) {
727790
if (prompt_options.length===0) prompt_options.push('none');
728791

729792
browserRef = window.cordova.InAppBrowser.open(
730-
'https://accounts.google.com/o/oauth2/auth?'
731-
+ 'client_id=' + clientId
732-
+ '&redirect_uri=' + redirect_uri
733-
+ '&scope=' + appScope.join(" ")
793+
'https://accounts.google.com/o/oauth2/auth?client_id=' + clientId
794+
+ '&redirect_uri=' + redirect_uri
795+
+ '&scope=' + appScope.join(" ")
796+
//+ '&approval_prompt=' + approval_prompt
734797
+ '&response_type=token'
735-
+ '&prompt=' + prompt_options.join(" ")
736-
+ '&login_hint=' + login_hint
798+
+ '&prompt=' + prompt_options.join(" ")
799+
+ '&login_hint=' + login_hint
737800

738801
, '_blank'
739802

740-
, 'location=no,hidden=yes'
741-
+ ',clearsessioncache=' + clear_session
742-
+ ',clearcache=' + clear_cache
803+
, 'location=no,hidden=yes,'
804+
+ 'clearsessioncache=' + clear_session
805+
+ ',clearcache=' + clear_cache
743806
);
744807

745-
//this hooks into browser new pages to test if the proccess of authentication have reached its end (loading redirect_uri)
746-
//so that it can grab redirect_uri query string to capture token
747-
//also, closes the browser in order to get back to app
748-
browserRef.addEventListener("loadstart", function(event) {
749-
if((event.url).indexOf(redirect_uri) === 0) { //if new URL begins with redirect_uri
750-
cleanUp();
751-
//generates object from query string
752-
var callbackResponse = (event.url).split("#")[1];
753-
var responseParameters = (callbackResponse).split("&");
754-
var parameterMap = [];
755-
for(var i = 0; i < responseParameters.length; i++) {
756-
parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
757-
}
758-
if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
759-
deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, expires_in: parameterMap.expires_in });
760-
} else {
761-
deferred.reject("Problem authenticating");
762-
}
763-
}
764-
});
765808

766-
browserRef.addEventListener("loaderror", function(event) {
767-
if((event.url).indexOf(redirect_uri) === 0) {
768-
return; // nothing to do here, this error is expected. 'loadstart' event will treat it.
769-
}
770-
//something went wrong, so, let's cleanup
771-
cleanUp();
772-
773-
774-
deferred.reject("Problem authenticating (loaderror)"); //and get back to the app with an error
775-
console.log("inAppBrowser loaderror => event: ", JSON.stringify(event) );
776-
777-
778-
});
779-
browserRef.addEventListener("loadstop", function(event) {
780-
781-
browserRef.show(); //just show the browser on first page loaded
782-
//navigator.notification.activityStop();
783-
784-
browserRef.removeEventListener("loadstop",function(event){}); //remove itself
785-
});
786-
787-
browserRef.addEventListener('exit', function(event) {
788-
deferred.reject("The sign in flow was canceled");
789-
});
809+
//setup listeners
810+
browserRef.addEventListener("loadstart", loadstartFn);
811+
browserRef.addEventListener("loaderror", loaderrorFn);
812+
browserRef.addEventListener("loadstop", loadstopFn);
813+
browserRef.addEventListener('exit', exitFn);
790814

791815
} else {
792816
deferred.reject("Could not find InAppBrowser plugin");

0 commit comments

Comments
 (0)