| Index: services/ui/gpu/gpu_service.cc
 | 
| diff --git a/services/ui/gpu/gpu_service.cc b/services/ui/gpu/gpu_service.cc
 | 
| index 25e576bffecd27553d8fae43c82c58162e02643c..f26ce2923827ed9b37527256ca55455091cff777 100644
 | 
| --- a/services/ui/gpu/gpu_service.cc
 | 
| +++ b/services/ui/gpu/gpu_service.cc
 | 
| @@ -8,6 +8,7 @@
 | 
|  #include "base/debug/crash_logging.h"
 | 
|  #include "base/lazy_instance.h"
 | 
|  #include "base/memory/shared_memory.h"
 | 
| +#include "base/message_loop/message_loop.h"
 | 
|  #include "base/threading/thread_task_runner_handle.h"
 | 
|  #include "build/build_config.h"
 | 
|  #include "cc/output/in_process_context_provider.h"
 | 
| @@ -189,6 +190,62 @@ void GpuService::GetVideoMemoryUsageStats(
 | 
|    callback.Run(video_memory_usage_stats);
 | 
|  }
 | 
|  
 | 
| +void GpuService::RequestCompleteGpuInfo(
 | 
| +    const RequestCompleteGpuInfoCallback& callback) {
 | 
| +  UpdateGpuInfoPlatform();
 | 
| +  callback.Run(gpu_info_);
 | 
| +#if defined(OS_WIN)
 | 
| +  if (!in_host_process_) {
 | 
| +    // The unsandboxed GPU process fulfilled its duty. Rest in peace.
 | 
| +    base::MessageLoop::current()->QuitWhenIdle();
 | 
| +  }
 | 
| +#endif
 | 
| +}
 | 
| +
 | 
| +#if defined(OS_MACOSX)
 | 
| +void GpuService::UpdateGpuInfoPlatform() {
 | 
| +  // gpu::CollectContextGraphicsInfo() is already called during gpu process
 | 
| +  // initialization (see GpuInit::InitializeAndStartSandbox()) on non-mac
 | 
| +  // platforms, and during in-browser gpu thread initialization on all platforms
 | 
| +  // (See InProcessGpuThread::Init()).
 | 
| +  if (in_host_process_)
 | 
| +    return;
 | 
| +
 | 
| +  DCHECK_EQ(gpu::kCollectInfoNone, gpu_info_.context_info_state);
 | 
| +  gpu::CollectInfoResult result = gpu::CollectContextGraphicsInfo(&gpu_info_);
 | 
| +  switch (result) {
 | 
| +    case gpu::kCollectInfoFatalFailure:
 | 
| +      LOG(ERROR) << "gpu::CollectGraphicsInfo failed (fatal).";
 | 
| +      // TODO(piman): can we signal overall failure?
 | 
| +      break;
 | 
| +    case gpu::kCollectInfoNonFatalFailure:
 | 
| +      DVLOG(1) << "gpu::CollectGraphicsInfo failed (non-fatal).";
 | 
| +      break;
 | 
| +    case gpu::kCollectInfoNone:
 | 
| +      NOTREACHED();
 | 
| +      break;
 | 
| +    case gpu::kCollectInfoSuccess:
 | 
| +      break;
 | 
| +  }
 | 
| +  gpu::SetKeysForCrashLogging(gpu_info_);
 | 
| +}
 | 
| +#elif defined(OS_WIN)
 | 
| +void GpuService::UpdateGpuInfoPlatform() {
 | 
| +  // GPU full info collection should only happen on un-sandboxed GPU process
 | 
| +  // or single process/in-process gpu mode on Windows.
 | 
| +  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
 | 
| +  DCHECK(command_line->HasSwitch("disable-gpu-sandbox") || in_host_process_);
 | 
| +
 | 
| +  // This is slow, but it's the only thing the unsandboxed GPU process does,
 | 
| +  // and GpuDataManager prevents us from sending multiple collecting requests,
 | 
| +  // so it's OK to be blocking.
 | 
| +  gpu::GetDxDiagnostics(&gpu_info_.dx_diagnostics);
 | 
| +  gpu_info_.dx_diagnostics_info_state = gpu::kCollectInfoSuccess;
 | 
| +}
 | 
| +#else
 | 
| +void GpuService::UpdateGpuInfoPlatform() {}
 | 
| +#endif
 | 
| +
 | 
|  void GpuService::DidCreateOffscreenContext(const GURL& active_url) {
 | 
|    (*gpu_host_)->DidCreateOffscreenContext(active_url);
 | 
|  }
 | 
| 
 |