15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_ANDROID_PROVIDER_BLOCKING_UI_THREAD_ASYNC_REQUEST_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_ANDROID_PROVIDER_BLOCKING_UI_THREAD_ASYNC_REQUEST_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/android/provider/run_on_ui_thread_blocking.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allows making async requests and blocking the current thread until the 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// response arrives. The request is performed in the UI thread. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Users of this class MUST call RequestCompleted when receiving the response. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cannot be called directly from the UI thread. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockingUIThreadAsyncRequest { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingUIThreadAsyncRequest(); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs an asynchronous request, blocking the invoking thread until a response 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is received. Class users MUST call RequestCompleted when this happens. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that the response is also delivered to the UI thread. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The request argument can be defined using base::Bind. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Signature> 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunAsyncRequestOnUIThreadBlocking(base::Callback<Signature> request) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the request in the UI thread. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_completed_.Reset(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunOnUIThreadBlocking::Run( 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &BlockingUIThreadAsyncRequest::RunRequestOnUIThread<Signature>, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait until the request callback invokes Finished. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_completed_.Wait(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies about a finished request. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RequestCompleted(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Signature> 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void RunRequestOnUIThread(base::Callback<Signature> request) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.Run(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent request_completed_; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BlockingUIThreadAsyncRequest); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_ANDROID_PROVIDER_BLOCKING_UI_THREAD_ASYNC_REQUEST_H_ 56