1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/api/system_info/system_info_provider.h" 6 7 #include "base/bind.h" 8 #include "content/public/browser/browser_thread.h" 9 10 namespace extensions { 11 SystemInfoProvider()12SystemInfoProvider::SystemInfoProvider() 13 : is_waiting_for_completion_(false) { 14 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); 15 worker_pool_ = pool->GetSequencedTaskRunnerWithShutdownBehavior( 16 pool->GetSequenceToken(), 17 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 18 } 19 ~SystemInfoProvider()20SystemInfoProvider::~SystemInfoProvider() {} 21 PrepareQueryOnUIThread()22void SystemInfoProvider::PrepareQueryOnUIThread() {} 23 InitializeProvider(const base::Closure & do_query_info_callback)24void SystemInfoProvider::InitializeProvider(const base::Closure& 25 do_query_info_callback) { 26 do_query_info_callback.Run(); 27 } 28 StartQueryInfo(const QueryInfoCompletionCallback & callback)29void SystemInfoProvider::StartQueryInfo( 30 const QueryInfoCompletionCallback& callback) { 31 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 32 DCHECK(!callback.is_null()); 33 34 callbacks_.push(callback); 35 36 if (is_waiting_for_completion_) 37 return; 38 39 is_waiting_for_completion_ = true; 40 41 InitializeProvider(base::Bind( 42 &SystemInfoProvider::StartQueryInfoPostInitialization, this)); 43 } 44 OnQueryCompleted(bool success)45void SystemInfoProvider::OnQueryCompleted(bool success) { 46 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 47 48 while (!callbacks_.empty()) { 49 QueryInfoCompletionCallback callback = callbacks_.front(); 50 callback.Run(success); 51 callbacks_.pop(); 52 } 53 54 is_waiting_for_completion_ = false; 55 } 56 StartQueryInfoPostInitialization()57void SystemInfoProvider::StartQueryInfoPostInitialization() { 58 PrepareQueryOnUIThread(); 59 // Post the custom query info task to blocking pool for information querying 60 // and reply with OnQueryCompleted. 61 base::PostTaskAndReplyWithResult( 62 worker_pool_, 63 FROM_HERE, 64 base::Bind(&SystemInfoProvider::QueryInfo, this), 65 base::Bind(&SystemInfoProvider::OnQueryCompleted, this)); 66 } 67 68 } // namespace extensions 69