fingerprint.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Generating a fingerprint consists of two major steps: 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// (1) Gather all the necessary data. 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// (2) Write it into a protocol buffer. 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Step (2) is as simple as it sounds -- it's really just a matter of copying 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// data. Step (1) requires waiting on several asynchronous callbacks, which are 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// managed by the FingerprintDataLoader class. 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/risk/fingerprint.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/cpu.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/memory/weak_ptr.h" 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/scoped_observer.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/sys_info.h" 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/timer/timer.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/risk/proto/fingerprint.pb.h" 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/font_list_async.h" 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/geolocation_provider.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/gpu_data_manager.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/gpu_data_manager_observer.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/plugin_service.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_widget_host.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h" 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/geoposition.h" 39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h" 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_info.h" 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebScreenInfo.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/screen.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebScreenInfo; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace risk { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32 kFingerprinterVersion = 1; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Maximum amount of time, in seconds, to wait for loading asynchronous 56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// fingerprint data. 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)const int kTimeoutSeconds = 4; 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the delta between the local timezone and UTC. 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeDelta GetTimezoneOffset() { 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::Time utc = base::Time::Now(); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::Exploded local; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) utc.LocalExplode(&local); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::Time::FromUTCExploded(local) - utc; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the concatenation of the operating system name and version, e.g. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "Mac OS X 10.6.8". 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string GetOperatingSystemVersion() { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::SysInfo::OperatingSystemName() + " " + 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SysInfo::OperatingSystemVersion(); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adds the list of |fonts| to the |machine|. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AddFontsToFingerprint(const base::ListValue& fonts, 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::MachineCharacteristics* machine) { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::ListValue::const_iterator it = fonts.begin(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != fonts.end(); ++it) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Each item in the list is a two-element list such that the first element 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is the font family and the second is the font name. 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::ListValue* font_description = NULL; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success = (*it)->GetAsList(&font_description); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(success); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string font_name; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) success = font_description->GetString(1, &font_name); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(success); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->add_font(font_name); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adds the list of |plugins| to the |machine|. 96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid AddPluginsToFingerprint(const std::vector<content::WebPluginInfo>& plugins, 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::MachineCharacteristics* machine) { 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (std::vector<content::WebPluginInfo>::const_iterator it = plugins.begin(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != plugins.end(); ++it) { 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::MachineCharacteristics::Plugin* plugin = 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->add_plugin(); 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) plugin->set_name(base::UTF16ToUTF8(it->name)); 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) plugin->set_description(base::UTF16ToUTF8(it->desc)); 104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (std::vector<content::WebPluginMimeType>::const_iterator mime_type = 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->mime_types.begin(); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mime_type != it->mime_types.end(); ++mime_type) { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin->add_mime_type(mime_type->mime_type); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) plugin->set_version(base::UTF16ToUTF8(it->version)); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Adds the list of HTTP accept languages to the |machine|. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AddAcceptLanguagesToFingerprint( 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& accept_languages_str, 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::MachineCharacteristics* machine) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> accept_languages; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SplitString(accept_languages_str, ',', &accept_languages); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::vector<std::string>::const_iterator it = accept_languages.begin(); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != accept_languages.end(); ++it) { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->add_requested_language(*it); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This function writes 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (a) the number of screens, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (b) the primary display's screen size, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (c) the screen's color depth, and 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (d) the size of the screen unavailable to web page content, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// i.e. the Taskbar size on Windows 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// into the |machine|. 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AddScreenInfoToFingerprint(const WebScreenInfo& screen_info, 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::MachineCharacteristics* machine) { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(scottmg): NativeScreen maybe wrong. http://crbug.com/133312 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->set_screen_count( 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Screen::GetNativeScreen()->GetNumDisplays()); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Size screen_size = 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().GetSizeInPixel(); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->mutable_screen_size()->set_width(screen_size.width()); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->mutable_screen_size()->set_height(screen_size.height()); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->set_screen_color_depth(screen_info.depth); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Rect screen_rect(screen_info.rect); 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Rect available_rect(screen_info.availableRect); 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Rect unavailable_rect = 148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::SubtractRects(screen_rect, available_rect); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->mutable_unavailable_screen_size()->set_width( 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unavailable_rect.width()); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->mutable_unavailable_screen_size()->set_height( 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unavailable_rect.height()); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Writes info about the machine's CPU into the |machine|. 156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AddCpuInfoToFingerprint(Fingerprint::MachineCharacteristics* machine) { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::CPU cpu; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->mutable_cpu()->set_vendor_name(cpu.vendor_name()); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->mutable_cpu()->set_brand(cpu.cpu_brand()); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Writes info about the machine's GPU into the |machine|. 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AddGpuInfoToFingerprint(Fingerprint::MachineCharacteristics* machine) { 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gpu::GPUInfo& gpu_info = 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::GpuDataManager::GetInstance()->GetGPUInfo(); 166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!gpu_info.finalized) 167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::MachineCharacteristics::Graphics* graphics = 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->mutable_graphics_card(); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) graphics->set_vendor_id(gpu_info.gpu.vendor_id); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) graphics->set_device_id(gpu_info.gpu.device_id); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) graphics->set_driver_version(gpu_info.driver_version); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) graphics->set_driver_date(gpu_info.driver_date); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::MachineCharacteristics::Graphics::PerformanceStatistics* 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_performance = graphics->mutable_performance_statistics(); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_performance->set_graphics_score(gpu_info.performance_stats.graphics); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_performance->set_gaming_score(gpu_info.performance_stats.gaming); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_performance->set_overall_score(gpu_info.performance_stats.overall); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Waits for geoposition data to be loaded. Lives on the IO thread. 184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class GeopositionLoader { 185d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // |callback_| will be called on the UI thread with the loaded geoposition, 187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // once it is available. 188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GeopositionLoader( 189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::TimeDelta& timeout, 190d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const content::Geoposition&)>& callback); 191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ~GeopositionLoader() {} 192d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 193d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 194d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Methods to communicate with the GeolocationProvider. 195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void OnGotGeoposition(const content::Geoposition& geoposition); 196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The callback that will be called once the geoposition is available. 198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Will be called on the UI thread. 199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const content::Geoposition&)> callback_; 200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 201d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The callback used as an "observer" of the GeolocationProvider. 202d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::GeolocationProvider::LocationUpdateCallback geolocation_callback_; 203d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 204d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Timer to enforce a maximum timeout before the |callback_| is called, even 205d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // if the geoposition has not been loaded. 206d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::OneShotTimer<GeopositionLoader> timeout_timer_; 207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 208d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 209d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)GeopositionLoader::GeopositionLoader( 210d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::TimeDelta& timeout, 211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const content::Geoposition&)>& callback) 212d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : callback_(callback) { 213d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) timeout_timer_.Start(FROM_HERE, timeout, 214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&GeopositionLoader::OnGotGeoposition, 215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Unretained(this), 216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::Geoposition())); 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) geolocation_callback_ = 219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&GeopositionLoader::OnGotGeoposition, base::Unretained(this)); 220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::GeolocationProvider::GetInstance()->AddLocationUpdateCallback( 221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) geolocation_callback_, false); 222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void GeopositionLoader::OnGotGeoposition( 225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const content::Geoposition& geoposition) { 226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, 227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(callback_, geoposition)); 228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 229d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Unregister as an observer, since this class instance might be destroyed 230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // after this callback. Note: It's important to unregister *after* posting 231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the task above. Unregistering as an observer can have the side-effect of 232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // modifying the value of |geoposition|. 233d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool removed = 234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::GeolocationProvider::GetInstance()->RemoveLocationUpdateCallback( 235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) geolocation_callback_); 236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(removed); 237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delete this; 239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 241d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Asynchronously loads the user's current geoposition and calls |callback_| on 242d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// the UI thread with the loaded geoposition, once it is available. Expected to 243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// be called on the IO thread. 244d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void LoadGeoposition( 245d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::TimeDelta& timeout, 246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const content::Geoposition&)>& callback) { 247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The loader is responsible for freeing its own memory. 248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new GeopositionLoader(timeout, callback); 249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Waits for all asynchronous data required for the fingerprint to be loaded, 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// then fills out the fingerprint. 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FingerprintDataLoader : public content::GpuDataManagerObserver { 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FingerprintDataLoader( 25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint64 obfuscated_gaia_id, 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& window_bounds, 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& content_bounds, 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebScreenInfo& screen_info, 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version, 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& charset, 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& accept_languages, 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& install_time, 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& app_locale, 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& user_agent, 266d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::TimeDelta& timeout, 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(scoped_ptr<Fingerprint>)>& callback); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~FingerprintDataLoader() {} 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content::GpuDataManagerObserver: 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGpuInfoUpdate() OVERRIDE; 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Callbacks for asynchronously loaded data. 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGotFonts(scoped_ptr<base::ListValue> fonts); 277ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch void OnGotPlugins(const std::vector<content::WebPluginInfo>& plugins); 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void OnGotGeoposition(const content::Geoposition& geoposition); 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If all of the asynchronous data has been loaded, calls |callback_| with 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the fingerprint data. 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MaybeFillFingerprint(); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Calls |callback_| with the fingerprint data. 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void FillFingerprint(); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The GPU data provider. 288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Weak reference because the GpuDataManager class is a singleton. 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::GpuDataManager* const gpu_data_manager_; 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 291d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Ensures that any observer registrations for the GPU data are cleaned up by 2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // the time this object is destroyed. 2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ScopedObserver<content::GpuDataManager, FingerprintDataLoader> gpu_observer_; 2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Data that will be passed on to the next loading phase. See the comment for 296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // GetFingerprint() for a description of these variables. 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint64 obfuscated_gaia_id_; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect window_bounds_; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect content_bounds_; 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebScreenInfo screen_info_; 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string version_; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string charset_; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string accept_languages_; 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string app_locale_; 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string user_agent_; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time install_time_; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Data that will be loaded asynchronously. 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::ListValue> fonts_; 310ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::vector<content::WebPluginInfo> plugins_; 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool waiting_on_plugins_; 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::Geoposition geoposition_; 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 314d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Timer to enforce a maximum timeout before the |callback_| is called, even 315d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // if not all asynchronous data has been loaded. 316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::OneShotTimer<FingerprintDataLoader> timeout_timer_; 317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // For invalidating asynchronous callbacks that might arrive after |this| 319d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // instance is destroyed. 320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::WeakPtrFactory<FingerprintDataLoader> weak_ptr_factory_; 321d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The callback that will be called once all the data is available. 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Callback<void(scoped_ptr<Fingerprint>)> callback_; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FingerprintDataLoader); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FingerprintDataLoader::FingerprintDataLoader( 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint64 obfuscated_gaia_id, 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& window_bounds, 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& content_bounds, 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebScreenInfo& screen_info, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version, 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& charset, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& accept_languages, 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& install_time, 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& app_locale, 338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& user_agent, 339d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::TimeDelta& timeout, 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : gpu_data_manager_(content::GpuDataManager::GetInstance()), 3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gpu_observer_(this), 34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) obfuscated_gaia_id_(obfuscated_gaia_id), 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_bounds_(window_bounds), 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_bounds_(content_bounds), 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_info_(screen_info), 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) version_(version), 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) charset_(charset), 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) accept_languages_(accept_languages), 350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) app_locale_(app_locale), 351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) user_agent_(user_agent), 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) install_time_(install_time), 35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) waiting_on_plugins_(true), 354d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) weak_ptr_factory_(this), 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_(callback) { 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!install_time_.is_null()); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 358d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) timeout_timer_.Start(FROM_HERE, timeout, 359d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&FingerprintDataLoader::MaybeFillFingerprint, 360d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 361d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Load GPU data if needed. 363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (gpu_data_manager_->GpuAccessAllowed(NULL) && 364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch !gpu_data_manager_->IsCompleteGpuInfoAvailable()) { 3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gpu_observer_.Add(gpu_data_manager_); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_data_manager_->RequestCompleteGpuInfoIfNeeded(); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Load plugin data. 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::PluginService::GetInstance()->GetPlugins( 372d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&FingerprintDataLoader::OnGotPlugins, 373d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 37490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 37590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) waiting_on_plugins_ = false; 37690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Load font data. 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::GetFontListAsync( 380d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&FingerprintDataLoader::OnGotFonts, 381d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 38290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Load geolocation data. 38490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::BrowserThread::PostTask( 38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::BrowserThread::IO, FROM_HERE, 386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&LoadGeoposition, 387d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) timeout, 388d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&FingerprintDataLoader::OnGotGeoposition, 389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()))); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FingerprintDataLoader::OnGpuInfoUpdate() { 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gpu_data_manager_->IsCompleteGpuInfoAvailable()) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gpu_observer_.Remove(gpu_data_manager_); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MaybeFillFingerprint(); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FingerprintDataLoader::OnGotFonts(scoped_ptr<base::ListValue> fonts) { 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!fonts_); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fonts_.reset(fonts.release()); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MaybeFillFingerprint(); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FingerprintDataLoader::OnGotPlugins( 407ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::vector<content::WebPluginInfo>& plugins) { 40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(waiting_on_plugins_); 40990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) waiting_on_plugins_ = false; 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugins_ = plugins; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MaybeFillFingerprint(); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void FingerprintDataLoader::OnGotGeoposition( 41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const content::Geoposition& geoposition) { 41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!geoposition_.Validate()); 41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) geoposition_ = geoposition; 41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(geoposition_.Validate() || 42090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) geoposition_.error_code != content::Geoposition::ERROR_CODE_NONE); 42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 42290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MaybeFillFingerprint(); 42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FingerprintDataLoader::MaybeFillFingerprint() { 426d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // If all of the data has been loaded, or if the |timeout_timer_| has expired, 427d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // fill the fingerprint and clean up. 428d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!timeout_timer_.IsRunning() || 429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ((!gpu_data_manager_->GpuAccessAllowed(NULL) || 430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gpu_data_manager_->IsCompleteGpuInfoAvailable()) && 431d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) fonts_ && 432d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) !waiting_on_plugins_ && 433d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) (geoposition_.Validate() || 434d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) geoposition_.error_code != content::Geoposition::ERROR_CODE_NONE))) { 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillFingerprint(); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FingerprintDataLoader::FillFingerprint() { 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Fingerprint> fingerprint(new Fingerprint); 442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::MachineCharacteristics* machine = 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fingerprint->mutable_machine_characteristics(); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->set_operating_system_build(GetOperatingSystemVersion()); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We use the delta between the install time and the Unix epoch, in hours. 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->set_browser_install_time_hours( 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (install_time_ - base::Time::UnixEpoch()).InHours()); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->set_utc_offset_ms(GetTimezoneOffset().InMilliseconds()); 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) machine->set_browser_language(app_locale_); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->set_charset(charset_); 452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) machine->set_user_agent(user_agent_); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->set_ram(base::SysInfo::AmountOfPhysicalMemory()); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine->set_browser_build(version_); 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) machine->set_browser_feature( 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Fingerprint::MachineCharacteristics::FEATURE_REQUEST_AUTOCOMPLETE); 457d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (fonts_) 458d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AddFontsToFingerprint(*fonts_, machine); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPluginsToFingerprint(plugins_, machine); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddAcceptLanguagesToFingerprint(accept_languages_, machine); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddScreenInfoToFingerprint(screen_info_, machine); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddCpuInfoToFingerprint(machine); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddGpuInfoToFingerprint(machine); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(isherman): Record the user_and_device_name_hash. 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(isherman): Record the partition size of the hard drives? 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::TransientState* transient_state = 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fingerprint->mutable_transient_state(); 470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::Dimension* inner_window_size = 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transient_state->mutable_inner_window_size(); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inner_window_size->set_width(content_bounds_.width()); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inner_window_size->set_height(content_bounds_.height()); 474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::Dimension* outer_window_size = 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transient_state->mutable_outer_window_size(); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) outer_window_size->set_width(window_bounds_.width()); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) outer_window_size->set_height(window_bounds_.height()); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(isherman): Record network performance data, which is theoretically 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // available to JS. 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(isherman): Record more user behavior data. 483d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (geoposition_.Validate() && 484d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) geoposition_.error_code == content::Geoposition::ERROR_CODE_NONE) { 485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::UserCharacteristics::Location* location = 48690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fingerprint->mutable_user_characteristics()->mutable_location(); 48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) location->set_altitude(geoposition_.altitude); 48890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) location->set_latitude(geoposition_.latitude); 48990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) location->set_longitude(geoposition_.longitude); 49090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) location->set_accuracy(geoposition_.accuracy); 49190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) location->set_time_in_ms( 49290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (geoposition_.timestamp - base::Time::UnixEpoch()).InMilliseconds()); 49390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Fingerprint::Metadata* metadata = fingerprint->mutable_metadata(); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata->set_timestamp_ms( 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (base::Time::Now() - base::Time::UnixEpoch()).InMilliseconds()); 49890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) metadata->set_obfuscated_gaia_id(obfuscated_gaia_id_); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) metadata->set_fingerprinter_version(kFingerprinterVersion); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_.Run(fingerprint.Pass()); 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace internal { 507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void GetFingerprintInternal( 509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) uint64 obfuscated_gaia_id, 510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Rect& window_bounds, 511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Rect& content_bounds, 512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebScreenInfo& screen_info, 513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& version, 514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& charset, 515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& accept_languages, 516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::Time& install_time, 517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& app_locale, 518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& user_agent, 519d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::TimeDelta& timeout, 520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) { 521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Begin loading all of the data that we need to load asynchronously. 522868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This class is responsible for freeing its own memory. 523868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new FingerprintDataLoader(obfuscated_gaia_id, window_bounds, content_bounds, 524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) screen_info, version, charset, accept_languages, 525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) install_time, app_locale, user_agent, timeout, 526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback); 527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace internal 530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetFingerprint( 53290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint64 obfuscated_gaia_id, 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& window_bounds, 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::WebContents& web_contents, 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version, 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& charset, 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& accept_languages, 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& install_time, 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& app_locale, 540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& user_agent, 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) { 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect content_bounds; 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents.GetView()->GetContainerBounds(&content_bounds); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebScreenInfo screen_info; 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderWidgetHostView* host_view = 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents.GetRenderWidgetHostView(); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_view) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_view->GetRenderWidgetHost()->GetWebScreenInfo(&screen_info); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::GetFingerprintInternal( 55290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) obfuscated_gaia_id, window_bounds, content_bounds, screen_info, version, 553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) charset, accept_languages, install_time, app_locale, user_agent, 554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::TimeDelta::FromSeconds(kTimeoutSeconds), callback); 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace risk 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace autofill 559