瀏覽代碼

FIX: MacCloud/DropBox: authorization may not be done on the main thread (since NSAlert needs to run on the main thread)

rich2014 5 月之前
父節點
當前提交
6c8971858f
共有 1 個文件被更改,包括 4 次插入6 次删除
  1. 4 6
      plugins/wfx/MacCloud/src/dropbox/udropboxclient.pas

+ 4 - 6
plugins/wfx/MacCloud/src/dropbox/udropboxclient.pas

@@ -71,7 +71,7 @@ type
     _alert: NSAlert;
     _alert: NSAlert;
   private
   private
     procedure requestAuthorization;
     procedure requestAuthorization;
-    function waitAuthorizationAndPrompt: Boolean;
+    procedure waitAuthorizationAndPrompt;
     procedure closePrompt;
     procedure closePrompt;
     function requestToken: Boolean;
     function requestToken: Boolean;
     procedure onRedirect( const url: NSURL );
     procedure onRedirect( const url: NSURL );
@@ -286,7 +286,7 @@ begin
   THttpClientUtil.openInSafari( DropBoxConst.URI.OAUTH2, queryItems );
   THttpClientUtil.openInSafari( DropBoxConst.URI.OAUTH2, queryItems );
 end;
 end;
 
 
-function TDropBoxAuthPKCESession.waitAuthorizationAndPrompt: Boolean;
+procedure TDropBoxAuthPKCESession.waitAuthorizationAndPrompt;
 begin
 begin
   NSApplication(NSAPP).setOpenURLObserver( @self.onRedirect );
   NSApplication(NSAPP).setOpenURLObserver( @self.onRedirect );
   _alert:= NSAlert.new;
   _alert:= NSAlert.new;
@@ -296,7 +296,6 @@ begin
   _alert.runModal;
   _alert.runModal;
   _alert.release;
   _alert.release;
   _alert:= nil;
   _alert:= nil;
-  Result:= True;
 end;
 end;
 
 
 procedure TDropBoxAuthPKCESession.closePrompt;
 procedure TDropBoxAuthPKCESession.closePrompt;
@@ -377,7 +376,7 @@ function TDropBoxAuthPKCESession.authorize: Boolean;
 begin
 begin
   Result:= False;
   Result:= False;
   requestAuthorization;
   requestAuthorization;
-  waitAuthorizationAndPrompt;
+  TThread.Synchronize( TThread.CurrentThread, @waitAuthorizationAndPrompt );
   Result:= requestToken;
   Result:= requestToken;
 end;
 end;
 
 
@@ -649,6 +648,7 @@ end;
 constructor TDropBoxClient.Create(const config: TDropBoxConfig);
 constructor TDropBoxClient.Create(const config: TDropBoxConfig);
 begin
 begin
   _config:= config;
   _config:= config;
+  _authSession:= TDropBoxAuthPKCESession.Create( _config );
 end;
 end;
 
 
 destructor TDropBoxClient.Destroy;
 destructor TDropBoxClient.Destroy;
@@ -660,8 +660,6 @@ end;
 
 
 function TDropBoxClient.authorize: Boolean;
 function TDropBoxClient.authorize: Boolean;
 begin
 begin
-  Result:= False;
-  _authSession:= TDropBoxAuthPKCESession.Create( _config );
   Result:= _authSession.authorize;
   Result:= _authSession.authorize;
 end;
 end;