| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // Generating a fingerprint consists of two major steps: | 5 // Generating a fingerprint consists of two major steps: |
| 6 // (1) Gather all the necessary data. | 6 // (1) Gather all the necessary data. |
| 7 // (2) Write it into a protocol buffer. | 7 // (2) Write it into a protocol buffer. |
| 8 // | 8 // |
| 9 // Step (2) is as simple as it sounds -- it's really just a matter of copying | 9 // Step (2) is as simple as it sounds -- it's really just a matter of copying |
| 10 // data. Step (1) requires waiting on several asynchronous callbacks, which are | 10 // data. Step (1) requires waiting on several asynchronous callbacks, which are |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 } | 152 } |
| 153 | 153 |
| 154 // Writes info about the machine's CPU into the |machine|. | 154 // Writes info about the machine's CPU into the |machine|. |
| 155 void AddCpuInfoToFingerprint(Fingerprint::MachineCharacteristics* machine) { | 155 void AddCpuInfoToFingerprint(Fingerprint::MachineCharacteristics* machine) { |
| 156 base::CPU cpu; | 156 base::CPU cpu; |
| 157 machine->mutable_cpu()->set_vendor_name(cpu.vendor_name()); | 157 machine->mutable_cpu()->set_vendor_name(cpu.vendor_name()); |
| 158 machine->mutable_cpu()->set_brand(cpu.cpu_brand()); | 158 machine->mutable_cpu()->set_brand(cpu.cpu_brand()); |
| 159 } | 159 } |
| 160 | 160 |
| 161 // Writes info about the machine's GPU into the |machine|. | 161 // Writes info about the machine's GPU into the |machine|. |
| 162 void AddGpuInfoToFingerprint(Fingerprint::MachineCharacteristics* machine) { | 162 void AddGpuInfoToFingerprint(Fingerprint::MachineCharacteristics* machine, |
| 163 const gpu::GPUInfo& gpu_info = | 163 const content::GpuDataManager& gpu_data_manager) { |
| 164 content::GpuDataManager::GetInstance()->GetGPUInfo(); | 164 if (!gpu_data_manager.IsEssentialGpuInfoAvailable()) |
| 165 if (!gpu_info.finalized) | |
| 166 return; | 165 return; |
| 167 | 166 |
| 167 const gpu::GPUInfo gpu_info = gpu_data_manager.GetGPUInfo(); |
| 168 |
| 168 Fingerprint::MachineCharacteristics::Graphics* graphics = | 169 Fingerprint::MachineCharacteristics::Graphics* graphics = |
| 169 machine->mutable_graphics_card(); | 170 machine->mutable_graphics_card(); |
| 170 graphics->set_vendor_id(gpu_info.gpu.vendor_id); | 171 graphics->set_vendor_id(gpu_info.gpu.vendor_id); |
| 171 graphics->set_device_id(gpu_info.gpu.device_id); | 172 graphics->set_device_id(gpu_info.gpu.device_id); |
| 172 graphics->set_driver_version(gpu_info.driver_version); | 173 graphics->set_driver_version(gpu_info.driver_version); |
| 173 graphics->set_driver_date(gpu_info.driver_date); | 174 graphics->set_driver_date(gpu_info.driver_date); |
| 174 | 175 |
| 175 Fingerprint::MachineCharacteristics::Graphics::PerformanceStatistics* | 176 Fingerprint::MachineCharacteristics::Graphics::PerformanceStatistics* |
| 176 gpu_performance = graphics->mutable_performance_statistics(); | 177 gpu_performance = graphics->mutable_performance_statistics(); |
| 177 gpu_performance->set_graphics_score(gpu_info.performance_stats.graphics); | 178 gpu_performance->set_graphics_score(gpu_info.performance_stats.graphics); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 weak_ptr_factory_(this), | 290 weak_ptr_factory_(this), |
| 290 callback_(callback) { | 291 callback_(callback) { |
| 291 DCHECK(!install_time_.is_null()); | 292 DCHECK(!install_time_.is_null()); |
| 292 | 293 |
| 293 timeout_timer_.Start(FROM_HERE, timeout, | 294 timeout_timer_.Start(FROM_HERE, timeout, |
| 294 base::Bind(&FingerprintDataLoader::MaybeFillFingerprint, | 295 base::Bind(&FingerprintDataLoader::MaybeFillFingerprint, |
| 295 weak_ptr_factory_.GetWeakPtr())); | 296 weak_ptr_factory_.GetWeakPtr())); |
| 296 | 297 |
| 297 // Load GPU data if needed. | 298 // Load GPU data if needed. |
| 298 if (gpu_data_manager_->GpuAccessAllowed(NULL) && | 299 if (gpu_data_manager_->GpuAccessAllowed(NULL) && |
| 299 !gpu_data_manager_->IsCompleteGpuInfoAvailable()) { | 300 !gpu_data_manager_->IsEssentialGpuInfoAvailable()) { |
| 300 gpu_observer_.Add(gpu_data_manager_); | 301 gpu_observer_.Add(gpu_data_manager_); |
| 301 gpu_data_manager_->RequestCompleteGpuInfoIfNeeded(); | 302 gpu_data_manager_->RequestCompleteGpuInfoIfNeeded(); |
| 302 } | 303 } |
| 303 | 304 |
| 304 #if defined(ENABLE_PLUGINS) | 305 #if defined(ENABLE_PLUGINS) |
| 305 // Load plugin data. | 306 // Load plugin data. |
| 306 content::PluginService::GetInstance()->GetPlugins( | 307 content::PluginService::GetInstance()->GetPlugins( |
| 307 base::Bind(&FingerprintDataLoader::OnGotPlugins, | 308 base::Bind(&FingerprintDataLoader::OnGotPlugins, |
| 308 weak_ptr_factory_.GetWeakPtr())); | 309 weak_ptr_factory_.GetWeakPtr())); |
| 309 #else | 310 #else |
| 310 waiting_on_plugins_ = false; | 311 waiting_on_plugins_ = false; |
| 311 #endif | 312 #endif |
| 312 | 313 |
| 313 // Load font data. | 314 // Load font data. |
| 314 content::GetFontListAsync( | 315 content::GetFontListAsync( |
| 315 base::Bind(&FingerprintDataLoader::OnGotFonts, | 316 base::Bind(&FingerprintDataLoader::OnGotFonts, |
| 316 weak_ptr_factory_.GetWeakPtr())); | 317 weak_ptr_factory_.GetWeakPtr())); |
| 317 | 318 |
| 318 // Load geolocation data. | 319 // Load geolocation data. |
| 319 geolocation_subscription_ = content::GeolocationProvider::GetInstance()-> | 320 geolocation_subscription_ = content::GeolocationProvider::GetInstance()-> |
| 320 AddLocationUpdateCallback( | 321 AddLocationUpdateCallback( |
| 321 base::Bind(&FingerprintDataLoader::OnGotGeoposition, | 322 base::Bind(&FingerprintDataLoader::OnGotGeoposition, |
| 322 weak_ptr_factory_.GetWeakPtr()), | 323 weak_ptr_factory_.GetWeakPtr()), |
| 323 false); | 324 false); |
| 324 } | 325 } |
| 325 | 326 |
| 326 void FingerprintDataLoader::OnGpuInfoUpdate() { | 327 void FingerprintDataLoader::OnGpuInfoUpdate() { |
| 327 if (!gpu_data_manager_->IsCompleteGpuInfoAvailable()) | 328 if (!gpu_data_manager_->IsEssentialGpuInfoAvailable()) |
| 328 return; | 329 return; |
| 329 | 330 |
| 330 gpu_observer_.Remove(gpu_data_manager_); | 331 gpu_observer_.Remove(gpu_data_manager_); |
| 331 MaybeFillFingerprint(); | 332 MaybeFillFingerprint(); |
| 332 } | 333 } |
| 333 | 334 |
| 334 void FingerprintDataLoader::OnGotFonts(scoped_ptr<base::ListValue> fonts) { | 335 void FingerprintDataLoader::OnGotFonts(scoped_ptr<base::ListValue> fonts) { |
| 335 DCHECK(!fonts_); | 336 DCHECK(!fonts_); |
| 336 fonts_.reset(fonts.release()); | 337 fonts_.reset(fonts.release()); |
| 337 MaybeFillFingerprint(); | 338 MaybeFillFingerprint(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 355 geolocation_subscription_.reset(); | 356 geolocation_subscription_.reset(); |
| 356 | 357 |
| 357 MaybeFillFingerprint(); | 358 MaybeFillFingerprint(); |
| 358 } | 359 } |
| 359 | 360 |
| 360 void FingerprintDataLoader::MaybeFillFingerprint() { | 361 void FingerprintDataLoader::MaybeFillFingerprint() { |
| 361 // If all of the data has been loaded, or if the |timeout_timer_| has expired, | 362 // If all of the data has been loaded, or if the |timeout_timer_| has expired, |
| 362 // fill the fingerprint and clean up. | 363 // fill the fingerprint and clean up. |
| 363 if (!timeout_timer_.IsRunning() || | 364 if (!timeout_timer_.IsRunning() || |
| 364 ((!gpu_data_manager_->GpuAccessAllowed(NULL) || | 365 ((!gpu_data_manager_->GpuAccessAllowed(NULL) || |
| 365 gpu_data_manager_->IsCompleteGpuInfoAvailable()) && | 366 gpu_data_manager_->IsEssentialGpuInfoAvailable()) && |
| 366 fonts_ && | 367 fonts_ && |
| 367 !waiting_on_plugins_ && | 368 !waiting_on_plugins_ && |
| 368 (geoposition_.Validate() || | 369 (geoposition_.Validate() || |
| 369 geoposition_.error_code != content::Geoposition::ERROR_CODE_NONE))) { | 370 geoposition_.error_code != content::Geoposition::ERROR_CODE_NONE))) { |
| 370 FillFingerprint(); | 371 FillFingerprint(); |
| 371 delete this; | 372 delete this; |
| 372 } | 373 } |
| 373 } | 374 } |
| 374 | 375 |
| 375 void FingerprintDataLoader::FillFingerprint() { | 376 void FingerprintDataLoader::FillFingerprint() { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 388 machine->set_ram(base::SysInfo::AmountOfPhysicalMemory()); | 389 machine->set_ram(base::SysInfo::AmountOfPhysicalMemory()); |
| 389 machine->set_browser_build(version_); | 390 machine->set_browser_build(version_); |
| 390 machine->set_browser_feature( | 391 machine->set_browser_feature( |
| 391 Fingerprint::MachineCharacteristics::FEATURE_REQUEST_AUTOCOMPLETE); | 392 Fingerprint::MachineCharacteristics::FEATURE_REQUEST_AUTOCOMPLETE); |
| 392 if (fonts_) | 393 if (fonts_) |
| 393 AddFontsToFingerprint(*fonts_, machine); | 394 AddFontsToFingerprint(*fonts_, machine); |
| 394 AddPluginsToFingerprint(plugins_, machine); | 395 AddPluginsToFingerprint(plugins_, machine); |
| 395 AddAcceptLanguagesToFingerprint(accept_languages_, machine); | 396 AddAcceptLanguagesToFingerprint(accept_languages_, machine); |
| 396 AddScreenInfoToFingerprint(screen_info_, machine); | 397 AddScreenInfoToFingerprint(screen_info_, machine); |
| 397 AddCpuInfoToFingerprint(machine); | 398 AddCpuInfoToFingerprint(machine); |
| 398 AddGpuInfoToFingerprint(machine); | 399 AddGpuInfoToFingerprint(machine, *gpu_data_manager_); |
| 399 | 400 |
| 400 // TODO(isherman): Record the user_and_device_name_hash. | 401 // TODO(isherman): Record the user_and_device_name_hash. |
| 401 // TODO(isherman): Record the partition size of the hard drives? | 402 // TODO(isherman): Record the partition size of the hard drives? |
| 402 | 403 |
| 403 Fingerprint::TransientState* transient_state = | 404 Fingerprint::TransientState* transient_state = |
| 404 fingerprint->mutable_transient_state(); | 405 fingerprint->mutable_transient_state(); |
| 405 Fingerprint::Dimension* inner_window_size = | 406 Fingerprint::Dimension* inner_window_size = |
| 406 transient_state->mutable_inner_window_size(); | 407 transient_state->mutable_inner_window_size(); |
| 407 inner_window_size->set_width(content_bounds_.width()); | 408 inner_window_size->set_width(content_bounds_.width()); |
| 408 inner_window_size->set_height(content_bounds_.height()); | 409 inner_window_size->set_height(content_bounds_.height()); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 host_view->GetRenderWidgetHost()->GetWebScreenInfo(&screen_info); | 484 host_view->GetRenderWidgetHost()->GetWebScreenInfo(&screen_info); |
| 484 | 485 |
| 485 internal::GetFingerprintInternal( | 486 internal::GetFingerprintInternal( |
| 486 obfuscated_gaia_id, window_bounds, content_bounds, screen_info, version, | 487 obfuscated_gaia_id, window_bounds, content_bounds, screen_info, version, |
| 487 charset, accept_languages, install_time, app_locale, user_agent, | 488 charset, accept_languages, install_time, app_locale, user_agent, |
| 488 base::TimeDelta::FromSeconds(kTimeoutSeconds), callback); | 489 base::TimeDelta::FromSeconds(kTimeoutSeconds), callback); |
| 489 } | 490 } |
| 490 | 491 |
| 491 } // namespace risk | 492 } // namespace risk |
| 492 } // namespace autofill | 493 } // namespace autofill |
| OLD | NEW |