Skip to content

Commit 6795b42

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 6795b42

File tree

1 file changed

+82
-59
lines changed

1 file changed

+82
-59
lines changed

dist/ng-cordova-oauth.js

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

696758
if(window.cordova) {
697759

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

729791
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(" ")
792+
'https://accounts.google.com/o/oauth2/auth?client_id=' + clientId
793+
+ '&redirect_uri=' + redirect_uri
794+
+ '&scope=' + appScope.join(" ")
795+
//+ '&approval_prompt=' + approval_prompt
734796
+ '&response_type=token'
735-
+ '&prompt=' + prompt_options.join(" ")
736-
+ '&login_hint=' + login_hint
797+
+ '&prompt=' + prompt_options.join(" ")
798+
+ '&login_hint=' + login_hint
737799

738800
, '_blank'
739801

740-
, 'location=no,hidden=yes'
741-
+ ',clearsessioncache=' + clear_session
742-
+ ',clearcache=' + clear_cache
802+
, 'location=no,hidden=yes,'
803+
+ 'clearsessioncache=' + clear_session
804+
+ ',clearcache=' + clear_cache
743805
);
744806

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-
});
765807

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-
});
808+
//setup listeners
809+
browserRef.addEventListener("loadstart", loadstartFn);
810+
browserRef.addEventListener("loaderror", loaderrorFn);
811+
browserRef.addEventListener("loadstop", loadstopFn);
812+
browserRef.addEventListener('exit', exitFn);
790813

791814
} else {
792815
deferred.reject("Could not find InAppBrowser plugin");

0 commit comments

Comments
 (0)