@@ -683,15 +683,77 @@ function google($q, $http, $cordovaOauthUtility) {
683
683
684
684
var browserRef , deferred = $q . defer ( ) ;
685
685
686
+
686
687
// ------------- local funcions ----------------
687
688
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
+ }
694
695
}
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 ----------------
695
757
696
758
if ( window . cordova ) {
697
759
@@ -727,66 +789,27 @@ function google($q, $http, $cordovaOauthUtility) {
727
789
if ( prompt_options . length === 0 ) prompt_options . push ( 'none' ) ;
728
790
729
791
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
734
796
+ '&response_type=token'
735
- + '&prompt=' + prompt_options . join ( " " )
736
- + '&login_hint=' + login_hint
797
+ + '&prompt=' + prompt_options . join ( " " )
798
+ + '&login_hint=' + login_hint
737
799
738
800
, '_blank'
739
801
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
743
805
) ;
744
806
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
- } ) ;
765
807
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 ) ;
790
813
791
814
} else {
792
815
deferred . reject ( "Could not find InAppBrowser plugin" ) ;
0 commit comments