@@ -683,15 +683,78 @@ 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 . removeEventListener ( "loaderror" , loaderrorFn ) ;
694
+ browserRef . close ( ) ;
695
+ }
694
696
}
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 ----------------
695
758
696
759
if ( window . cordova ) {
697
760
@@ -727,66 +790,27 @@ function google($q, $http, $cordovaOauthUtility) {
727
790
if ( prompt_options . length === 0 ) prompt_options . push ( 'none' ) ;
728
791
729
792
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
734
797
+ '&response_type=token'
735
- + '&prompt=' + prompt_options . join ( " " )
736
- + '&login_hint=' + login_hint
798
+ + '&prompt=' + prompt_options . join ( " " )
799
+ + '&login_hint=' + login_hint
737
800
738
801
, '_blank'
739
802
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
743
806
) ;
744
807
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
808
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 ) ;
790
814
791
815
} else {
792
816
deferred . reject ( "Could not find InAppBrowser plugin" ) ;
0 commit comments