Chromium Code Reviews| 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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 61 return base::Time::FromUTCExploded(local) - utc; | 61 return base::Time::FromUTCExploded(local) - utc; |
| 62 } | 62 } |
| 63 | 63 |
| 64 // Returns the concatenation of the operating system name and version, e.g. | 64 // Returns the concatenation of the operating system name and version, e.g. |
| 65 // "Mac OS X 10.6.8". | 65 // "Mac OS X 10.6.8". |
| 66 std::string GetOperatingSystemVersion() { | 66 std::string GetOperatingSystemVersion() { |
| 67 return base::SysInfo::OperatingSystemName() + " " + | 67 return base::SysInfo::OperatingSystemName() + " " + |
| 68 base::SysInfo::OperatingSystemVersion(); | 68 base::SysInfo::OperatingSystemVersion(); |
| 69 } | 69 } |
| 70 | 70 |
| 71 Fingerprint::MachineCharacteristics::BrowserFeature | |
| 72 DialogTypeToBrowserFeature(DialogType dialog_type) { | |
| 73 switch (dialog_type) { | |
| 74 case DIALOG_TYPE_AUTOCHECKOUT: | |
| 75 return Fingerprint::MachineCharacteristics::FEATURE_AUTOCHECKOUT; | |
| 76 | |
| 77 case DIALOG_TYPE_REQUEST_AUTOCOMPLETE: | |
| 78 return Fingerprint::MachineCharacteristics::FEATURE_REQUEST_AUTOCOMPLETE; | |
| 79 } | |
| 80 | |
| 81 NOTREACHED(); | |
| 82 return Fingerprint::MachineCharacteristics::FEATURE_UNKNOWN; | |
| 83 } | |
| 84 | |
| 85 // Adds the list of |fonts| to the |machine|. | 71 // Adds the list of |fonts| to the |machine|. |
| 86 void AddFontsToFingerprint(const base::ListValue& fonts, | 72 void AddFontsToFingerprint(const base::ListValue& fonts, |
| 87 Fingerprint::MachineCharacteristics* machine) { | 73 Fingerprint::MachineCharacteristics* machine) { |
| 88 for (base::ListValue::const_iterator it = fonts.begin(); | 74 for (base::ListValue::const_iterator it = fonts.begin(); |
| 89 it != fonts.end(); ++it) { | 75 it != fonts.end(); ++it) { |
| 90 // Each item in the list is a two-element list such that the first element | 76 // Each item in the list is a two-element list such that the first element |
| 91 // is the font family and the second is the font name. | 77 // is the font family and the second is the font name. |
| 92 const base::ListValue* font_description = NULL; | 78 const base::ListValue* font_description = NULL; |
| 93 bool success = (*it)->GetAsList(&font_description); | 79 bool success = (*it)->GetAsList(&font_description); |
| 94 DCHECK(success); | 80 DCHECK(success); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 194 public: | 180 public: |
| 195 FingerprintDataLoader( | 181 FingerprintDataLoader( |
| 196 uint64 obfuscated_gaia_id, | 182 uint64 obfuscated_gaia_id, |
| 197 const gfx::Rect& window_bounds, | 183 const gfx::Rect& window_bounds, |
| 198 const gfx::Rect& content_bounds, | 184 const gfx::Rect& content_bounds, |
| 199 const WebScreenInfo& screen_info, | 185 const WebScreenInfo& screen_info, |
| 200 const std::string& version, | 186 const std::string& version, |
| 201 const std::string& charset, | 187 const std::string& charset, |
| 202 const std::string& accept_languages, | 188 const std::string& accept_languages, |
| 203 const base::Time& install_time, | 189 const base::Time& install_time, |
| 204 DialogType dialog_type, | |
| 205 const std::string& app_locale, | 190 const std::string& app_locale, |
| 206 const base::Callback<void(scoped_ptr<Fingerprint>)>& callback); | 191 const base::Callback<void(scoped_ptr<Fingerprint>)>& callback); |
| 207 | 192 |
| 208 private: | 193 private: |
| 209 virtual ~FingerprintDataLoader() {} | 194 virtual ~FingerprintDataLoader() {} |
| 210 | 195 |
| 211 // content::GpuDataManagerObserver: | 196 // content::GpuDataManagerObserver: |
| 212 virtual void OnGpuInfoUpdate() OVERRIDE; | 197 virtual void OnGpuInfoUpdate() OVERRIDE; |
| 213 | 198 |
| 214 // Callbacks for asynchronously loaded data. | 199 // Callbacks for asynchronously loaded data. |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 243 // Data that will be passed on to the next loading phase. See the comment for | 228 // Data that will be passed on to the next loading phase. See the comment for |
| 244 // GetFingerprint() for a description of these variables. | 229 // GetFingerprint() for a description of these variables. |
| 245 const uint64 obfuscated_gaia_id_; | 230 const uint64 obfuscated_gaia_id_; |
| 246 const gfx::Rect window_bounds_; | 231 const gfx::Rect window_bounds_; |
| 247 const gfx::Rect content_bounds_; | 232 const gfx::Rect content_bounds_; |
| 248 const WebScreenInfo screen_info_; | 233 const WebScreenInfo screen_info_; |
| 249 const std::string version_; | 234 const std::string version_; |
| 250 const std::string charset_; | 235 const std::string charset_; |
| 251 const std::string accept_languages_; | 236 const std::string accept_languages_; |
| 252 const base::Time install_time_; | 237 const base::Time install_time_; |
| 253 DialogType dialog_type_; | |
| 254 | 238 |
| 255 // Data that will be loaded asynchronously. | 239 // Data that will be loaded asynchronously. |
| 256 scoped_ptr<base::ListValue> fonts_; | 240 scoped_ptr<base::ListValue> fonts_; |
| 257 std::vector<content::WebPluginInfo> plugins_; | 241 std::vector<content::WebPluginInfo> plugins_; |
| 258 bool waiting_on_plugins_; | 242 bool waiting_on_plugins_; |
| 259 content::Geoposition geoposition_; | 243 content::Geoposition geoposition_; |
| 260 | 244 |
| 261 // The current application locale. | 245 // The current application locale. |
| 262 std::string app_locale_; | 246 std::string app_locale_; |
| 263 | 247 |
| 264 // The callback that will be called once all the data is available. | 248 // The callback that will be called once all the data is available. |
| 265 base::Callback<void(scoped_ptr<Fingerprint>)> callback_; | 249 base::Callback<void(scoped_ptr<Fingerprint>)> callback_; |
| 266 | 250 |
| 267 DISALLOW_COPY_AND_ASSIGN(FingerprintDataLoader); | 251 DISALLOW_COPY_AND_ASSIGN(FingerprintDataLoader); |
| 268 }; | 252 }; |
| 269 | 253 |
| 270 FingerprintDataLoader::FingerprintDataLoader( | 254 FingerprintDataLoader::FingerprintDataLoader( |
| 271 uint64 obfuscated_gaia_id, | 255 uint64 obfuscated_gaia_id, |
| 272 const gfx::Rect& window_bounds, | 256 const gfx::Rect& window_bounds, |
| 273 const gfx::Rect& content_bounds, | 257 const gfx::Rect& content_bounds, |
| 274 const WebScreenInfo& screen_info, | 258 const WebScreenInfo& screen_info, |
| 275 const std::string& version, | 259 const std::string& version, |
| 276 const std::string& charset, | 260 const std::string& charset, |
| 277 const std::string& accept_languages, | 261 const std::string& accept_languages, |
| 278 const base::Time& install_time, | 262 const base::Time& install_time, |
| 279 DialogType dialog_type, | |
| 280 const std::string& app_locale, | 263 const std::string& app_locale, |
| 281 const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) | 264 const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) |
| 282 : gpu_data_manager_(content::GpuDataManager::GetInstance()), | 265 : gpu_data_manager_(content::GpuDataManager::GetInstance()), |
| 283 gpu_observer_(this), | 266 gpu_observer_(this), |
| 284 obfuscated_gaia_id_(obfuscated_gaia_id), | 267 obfuscated_gaia_id_(obfuscated_gaia_id), |
| 285 window_bounds_(window_bounds), | 268 window_bounds_(window_bounds), |
| 286 content_bounds_(content_bounds), | 269 content_bounds_(content_bounds), |
| 287 screen_info_(screen_info), | 270 screen_info_(screen_info), |
| 288 version_(version), | 271 version_(version), |
| 289 charset_(charset), | 272 charset_(charset), |
| 290 accept_languages_(accept_languages), | 273 accept_languages_(accept_languages), |
| 291 install_time_(install_time), | 274 install_time_(install_time), |
| 292 dialog_type_(dialog_type), | |
| 293 waiting_on_plugins_(true), | 275 waiting_on_plugins_(true), |
| 294 callback_(callback) { | 276 callback_(callback) { |
| 295 DCHECK(!install_time_.is_null()); | 277 DCHECK(!install_time_.is_null()); |
| 296 | 278 |
| 297 // Load GPU data if needed. | 279 // Load GPU data if needed. |
| 298 if (!gpu_data_manager_->IsCompleteGpuInfoAvailable()) { | 280 if (!gpu_data_manager_->IsCompleteGpuInfoAvailable()) { |
| 299 gpu_observer_.Add(gpu_data_manager_); | 281 gpu_observer_.Add(gpu_data_manager_); |
| 300 gpu_data_manager_->RequestCompleteGpuInfoIfNeeded(); | 282 gpu_data_manager_->RequestCompleteGpuInfoIfNeeded(); |
| 301 } | 283 } |
| 302 | 284 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 397 machine->set_operating_system_build(GetOperatingSystemVersion()); | 379 machine->set_operating_system_build(GetOperatingSystemVersion()); |
| 398 // We use the delta between the install time and the Unix epoch, in hours. | 380 // We use the delta between the install time and the Unix epoch, in hours. |
| 399 machine->set_browser_install_time_hours( | 381 machine->set_browser_install_time_hours( |
| 400 (install_time_ - base::Time::UnixEpoch()).InHours()); | 382 (install_time_ - base::Time::UnixEpoch()).InHours()); |
| 401 machine->set_utc_offset_ms(GetTimezoneOffset().InMilliseconds()); | 383 machine->set_utc_offset_ms(GetTimezoneOffset().InMilliseconds()); |
| 402 machine->set_browser_language(app_locale_); | 384 machine->set_browser_language(app_locale_); |
| 403 machine->set_charset(charset_); | 385 machine->set_charset(charset_); |
| 404 machine->set_user_agent(content::GetUserAgent(GURL())); | 386 machine->set_user_agent(content::GetUserAgent(GURL())); |
| 405 machine->set_ram(base::SysInfo::AmountOfPhysicalMemory()); | 387 machine->set_ram(base::SysInfo::AmountOfPhysicalMemory()); |
| 406 machine->set_browser_build(version_); | 388 machine->set_browser_build(version_); |
| 407 machine->set_browser_feature(DialogTypeToBrowserFeature(dialog_type_)); | 389 machine->set_browser_feature( |
| 390 Fingerprint::MachineCharacteristics::FEATURE_REQUEST_AUTOCOMPLETE); | |
| 408 AddFontsToFingerprint(*fonts_, machine); | 391 AddFontsToFingerprint(*fonts_, machine); |
| 409 AddPluginsToFingerprint(plugins_, machine); | 392 AddPluginsToFingerprint(plugins_, machine); |
| 410 AddAcceptLanguagesToFingerprint(accept_languages_, machine); | 393 AddAcceptLanguagesToFingerprint(accept_languages_, machine); |
| 411 AddScreenInfoToFingerprint(screen_info_, machine); | 394 AddScreenInfoToFingerprint(screen_info_, machine); |
| 412 AddCpuInfoToFingerprint(machine); | 395 AddCpuInfoToFingerprint(machine); |
| 413 AddGpuInfoToFingerprint(machine); | 396 AddGpuInfoToFingerprint(machine); |
| 414 | 397 |
| 415 // TODO(isherman): Record the user_and_device_name_hash. | 398 // TODO(isherman): Record the user_and_device_name_hash. |
| 416 // TODO(isherman): Record the partition size of the hard drives? | 399 // TODO(isherman): Record the partition size of the hard drives? |
| 417 | 400 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 456 | 439 |
| 457 void GetFingerprintInternal( | 440 void GetFingerprintInternal( |
| 458 uint64 obfuscated_gaia_id, | 441 uint64 obfuscated_gaia_id, |
| 459 const gfx::Rect& window_bounds, | 442 const gfx::Rect& window_bounds, |
| 460 const gfx::Rect& content_bounds, | 443 const gfx::Rect& content_bounds, |
| 461 const WebKit::WebScreenInfo& screen_info, | 444 const WebKit::WebScreenInfo& screen_info, |
| 462 const std::string& version, | 445 const std::string& version, |
| 463 const std::string& charset, | 446 const std::string& charset, |
| 464 const std::string& accept_languages, | 447 const std::string& accept_languages, |
| 465 const base::Time& install_time, | 448 const base::Time& install_time, |
| 466 DialogType dialog_type, | |
| 467 const std::string& app_locale, | 449 const std::string& app_locale, |
| 468 const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) { | 450 const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) { |
| 469 // Begin loading all of the data that we need to load asynchronously. | 451 // Begin loading all of the data that we need to load asynchronously. |
| 470 // This class is responsible for freeing its own memory. | 452 // This class is responsible for freeing its own memory. |
| 471 new FingerprintDataLoader(obfuscated_gaia_id, window_bounds, content_bounds, | 453 new FingerprintDataLoader(obfuscated_gaia_id, window_bounds, content_bounds, |
| 472 screen_info, version, charset, accept_languages, | 454 screen_info, version, charset, accept_languages, |
| 473 install_time, dialog_type, app_locale, callback); | 455 install_time, app_locale, callback); |
| 474 } | 456 } |
| 475 | 457 |
| 476 } // namespace internal | 458 } // namespace internal |
| 477 | 459 |
| 478 void GetFingerprint( | 460 void GetFingerprint( |
| 479 uint64 obfuscated_gaia_id, | 461 uint64 obfuscated_gaia_id, |
| 480 const gfx::Rect& window_bounds, | 462 const gfx::Rect& window_bounds, |
| 481 const content::WebContents& web_contents, | 463 const content::WebContents& web_contents, |
| 482 const std::string& version, | 464 const std::string& version, |
| 483 const std::string& charset, | 465 const std::string& charset, |
| 484 const std::string& accept_languages, | 466 const std::string& accept_languages, |
| 485 const base::Time& install_time, | 467 const base::Time& install_time, |
| 486 DialogType dialog_type, | |
| 487 const std::string& app_locale, | 468 const std::string& app_locale, |
| 488 const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) { | 469 const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) { |
| 489 gfx::Rect content_bounds; | 470 gfx::Rect content_bounds; |
| 490 web_contents.GetView()->GetContainerBounds(&content_bounds); | 471 web_contents.GetView()->GetContainerBounds(&content_bounds); |
| 491 | 472 |
| 492 WebKit::WebScreenInfo screen_info; | 473 WebKit::WebScreenInfo screen_info; |
| 493 content::RenderWidgetHostView* host_view = | 474 content::RenderWidgetHostView* host_view = |
| 494 web_contents.GetRenderWidgetHostView(); | 475 web_contents.GetRenderWidgetHostView(); |
| 495 if (host_view) | 476 if (host_view) |
| 496 host_view->GetRenderWidgetHost()->GetWebScreenInfo(&screen_info); | 477 host_view->GetRenderWidgetHost()->GetWebScreenInfo(&screen_info); |
| 497 | 478 |
| 498 internal::GetFingerprintInternal( | 479 internal::GetFingerprintInternal( |
| 499 obfuscated_gaia_id, window_bounds, content_bounds, screen_info, version, | 480 obfuscated_gaia_id, window_bounds, content_bounds, screen_info, version, |
| 500 charset, accept_languages, install_time, dialog_type, app_locale, | 481 charset, accept_languages, install_time, app_locale, |
| 501 callback); | 482 callback); |
|
Ilya Sherman
2013/09/03 20:57:05
nit: re-wrap.
Raman Kakilate
2013/09/03 21:50:31
Done.
| |
| 502 } | 483 } |
| 503 | 484 |
| 504 } // namespace risk | 485 } // namespace risk |
| 505 } // namespace autofill | 486 } // namespace autofill |
| OLD | NEW |