fingerprint.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generating a fingerprint consists of two major steps: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (1) Gather all the necessary data. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (2) Write it into a protocol buffer. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Step (2) is as simple as it sounds -- it's really just a matter of copying 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data. Step (1) requires waiting on several asynchronous callbacks, which are 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// managed by the FingerprintDataLoader class. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/autofill/content/browser/risk/fingerprint.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/cpu.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/scoped_observer.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/string_split.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time/time.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/autofill/content/browser/risk/proto/fingerprint.pb.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/font_list_async.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/geolocation_provider.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager_observer.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_client.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/geoposition.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/config/gpu_info.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebScreenInfo.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/webplugininfo.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebScreenInfo; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace autofill { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace risk { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kFingerprinterVersion = 1; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the delta between the local timezone and UTC. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta GetTimezoneOffset() { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time utc = base::Time::Now(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Exploded local; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utc.LocalExplode(&local); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::Time::FromUTCExploded(local) - utc; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the concatenation of the operating system name and version, e.g. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Mac OS X 10.6.8". 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetOperatingSystemVersion() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::SysInfo::OperatingSystemName() + " " + 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SysInfo::OperatingSystemVersion(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Fingerprint::MachineCharacteristics::BrowserFeature 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DialogTypeToBrowserFeature(DialogType dialog_type) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (dialog_type) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DIALOG_TYPE_AUTOCHECKOUT: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Fingerprint::MachineCharacteristics::FEATURE_AUTOCHECKOUT; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DIALOG_TYPE_REQUEST_AUTOCOMPLETE: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Fingerprint::MachineCharacteristics::FEATURE_REQUEST_AUTOCOMPLETE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Fingerprint::MachineCharacteristics::FEATURE_UNKNOWN; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds the list of |fonts| to the |machine|. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddFontsToFingerprint(const base::ListValue& fonts, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::MachineCharacteristics* machine) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::ListValue::const_iterator it = fonts.begin(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != fonts.end(); ++it) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each item in the list is a two-element list such that the first element 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is the font family and the second is the font name. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* font_description = NULL; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = (*it)->GetAsList(&font_description); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(success); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string font_name; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success = font_description->GetString(1, &font_name); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(success); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->add_font(font_name); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds the list of |plugins| to the |machine|. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddPluginsToFingerprint(const std::vector<webkit::WebPluginInfo>& plugins, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::MachineCharacteristics* machine) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<webkit::WebPluginInfo>::const_iterator it = plugins.begin(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != plugins.end(); ++it) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::MachineCharacteristics::Plugin* plugin = 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->add_plugin(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin->set_name(UTF16ToUTF8(it->name)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin->set_description(UTF16ToUTF8(it->desc)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<webkit::WebPluginMimeType>::const_iterator mime_type = 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->mime_types.begin(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type != it->mime_types.end(); ++mime_type) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin->add_mime_type(mime_type->mime_type); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin->set_version(UTF16ToUTF8(it->version)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds the list of HTTP accept languages to the |machine|. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddAcceptLanguagesToFingerprint( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& accept_languages_str, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::MachineCharacteristics* machine) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> accept_languages; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(accept_languages_str, ',', &accept_languages); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = accept_languages.begin(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != accept_languages.end(); ++it) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->add_requested_language(*it); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function writes 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (a) the number of screens, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (b) the primary display's screen size, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (c) the screen's color depth, and 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (d) the size of the screen unavailable to web page content, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// i.e. the Taskbar size on Windows 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// into the |machine|. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddScreenInfoToFingerprint(const WebScreenInfo& screen_info, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::MachineCharacteristics* machine) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(scottmg): NativeScreen maybe wrong. http://crbug.com/133312 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_screen_count( 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetNativeScreen()->GetNumDisplays()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size screen_size = 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().GetSizeInPixel(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->mutable_screen_size()->set_width(screen_size.width()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->mutable_screen_size()->set_height(screen_size.height()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_screen_color_depth(screen_info.depth); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect screen_rect(screen_info.rect); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect available_rect(screen_info.availableRect); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect unavailable_rect = 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::SubtractRects(screen_rect, available_rect); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->mutable_unavailable_screen_size()->set_width( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unavailable_rect.width()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->mutable_unavailable_screen_size()->set_height( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unavailable_rect.height()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Writes info about the machine's CPU into the |machine|. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddCpuInfoToFingerprint(Fingerprint::MachineCharacteristics* machine) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::CPU cpu; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->mutable_cpu()->set_vendor_name(cpu.vendor_name()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->mutable_cpu()->set_brand(cpu.cpu_brand()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Writes info about the machine's GPU into the |machine|. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddGpuInfoToFingerprint(Fingerprint::MachineCharacteristics* machine) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gpu::GPUInfo& gpu_info = 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::GpuDataManager::GetInstance()->GetGPUInfo(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(gpu_info.finalized); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::MachineCharacteristics::Graphics* graphics = 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->mutable_graphics_card(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) graphics->set_vendor_id(gpu_info.gpu.vendor_id); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) graphics->set_device_id(gpu_info.gpu.device_id); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) graphics->set_driver_version(gpu_info.driver_version); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) graphics->set_driver_date(gpu_info.driver_date); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::MachineCharacteristics::Graphics::PerformanceStatistics* 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_performance = graphics->mutable_performance_statistics(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_performance->set_graphics_score(gpu_info.performance_stats.graphics); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_performance->set_gaming_score(gpu_info.performance_stats.gaming); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_performance->set_overall_score(gpu_info.performance_stats.overall); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Waits for all asynchronous data required for the fingerprint to be loaded, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then fills out the fingerprint. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FingerprintDataLoader : public content::GpuDataManagerObserver { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FingerprintDataLoader( 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 obfuscated_gaia_id, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& window_bounds, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& content_bounds, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebScreenInfo& screen_info, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& version, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& charset, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& accept_languages, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& install_time, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DialogType dialog_type, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& app_locale, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(scoped_ptr<Fingerprint>)>& callback); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FingerprintDataLoader() {} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::GpuDataManagerObserver: 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGpuInfoUpdate() OVERRIDE; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callbacks for asynchronously loaded data. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGotFonts(scoped_ptr<base::ListValue> fonts); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGotPlugins(const std::vector<webkit::WebPluginInfo>& plugins); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGotGeoposition(const content::Geoposition& geoposition); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Methods that run on the IO thread to communicate with the 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GeolocationProvider. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadGeoposition(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGotGeopositionOnIOThread(const content::Geoposition& geoposition); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If all of the asynchronous data has been loaded, calls |callback_| with 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the fingerprint data. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MaybeFillFingerprint(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls |callback_| with the fingerprint data. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FillFingerprint(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The GPU data provider. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Weak reference because the GpuDataManager class is a singleton. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::GpuDataManager* const gpu_data_manager_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensures that any observer registratiosn for the GPU data are cleaned up by 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the time this object is destroyed. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedObserver<content::GpuDataManager, FingerprintDataLoader> gpu_observer_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The callback used as an "observer" of the GeolocationProvider. Accessed 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only on the IO thread. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::GeolocationProvider::LocationUpdateCallback geolocation_callback_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Data that will be passed on to the next loading phase. See the comment for 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetFingerprint() for a description of these variables. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint64 obfuscated_gaia_id_; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect window_bounds_; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect content_bounds_; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebScreenInfo screen_info_; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string version_; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string charset_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string accept_languages_; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time install_time_; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DialogType dialog_type_; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Data that will be loaded asynchronously. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::ListValue> fonts_; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<webkit::WebPluginInfo> plugins_; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool waiting_on_plugins_; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Geoposition geoposition_; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current application locale. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string app_locale_; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The callback that will be called once all the data is available. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<void(scoped_ptr<Fingerprint>)> callback_; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FingerprintDataLoader); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FingerprintDataLoader::FingerprintDataLoader( 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 obfuscated_gaia_id, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& window_bounds, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& content_bounds, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebScreenInfo& screen_info, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& version, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& charset, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& accept_languages, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& install_time, 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DialogType dialog_type, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& app_locale, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : gpu_data_manager_(content::GpuDataManager::GetInstance()), 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_observer_(this), 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obfuscated_gaia_id_(obfuscated_gaia_id), 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_bounds_(window_bounds), 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_bounds_(content_bounds), 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_info_(screen_info), 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version_(version), 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) charset_(charset), 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accept_languages_(accept_languages), 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_time_(install_time), 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_type_(dialog_type), 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_on_plugins_(true), 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_(callback) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!install_time_.is_null()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load GPU data if needed. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gpu_data_manager_->IsCompleteGpuInfoAvailable()) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_observer_.Add(gpu_data_manager_); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_data_manager_->RequestCompleteGpuInfoIfNeeded(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load plugin data. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PluginService::GetInstance()->GetPlugins( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&FingerprintDataLoader::OnGotPlugins, base::Unretained(this))); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_on_plugins_ = false; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load font data. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::GetFontListAsync( 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&FingerprintDataLoader::OnGotFonts, base::Unretained(this))); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load geolocation data. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::IO, FROM_HERE, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&FingerprintDataLoader::LoadGeoposition, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FingerprintDataLoader::OnGpuInfoUpdate() { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gpu_data_manager_->IsCompleteGpuInfoAvailable()) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_observer_.Remove(gpu_data_manager_); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeFillFingerprint(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FingerprintDataLoader::OnGotFonts(scoped_ptr<base::ListValue> fonts) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!fonts_); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fonts_.reset(fonts.release()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeFillFingerprint(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FingerprintDataLoader::OnGotPlugins( 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<webkit::WebPluginInfo>& plugins) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(waiting_on_plugins_); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_on_plugins_ = false; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugins_ = plugins; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeFillFingerprint(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FingerprintDataLoader::OnGotGeoposition( 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Geoposition& geoposition) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!geoposition_.Validate()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geoposition_ = geoposition; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(geoposition_.Validate() || 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geoposition_.error_code != content::Geoposition::ERROR_CODE_NONE); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeFillFingerprint(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FingerprintDataLoader::LoadGeoposition() { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_callback_ = 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&FingerprintDataLoader::OnGotGeopositionOnIOThread, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::GeolocationProvider::GetInstance()->AddLocationUpdateCallback( 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_callback_, false); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FingerprintDataLoader::OnGotGeopositionOnIOThread( 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Geoposition& geoposition) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&FingerprintDataLoader::OnGotGeoposition, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), geoposition)); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unregister as an observer, since this class instance might be destroyed 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after this callback. Note: It's important to unregister *after* posting 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the task above. Unregistering as an observer can have the side-effect of 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // modifying the value of |geoposition|. 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool removed = 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::GeolocationProvider::GetInstance()->RemoveLocationUpdateCallback( 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_callback_); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(removed); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FingerprintDataLoader::MaybeFillFingerprint() { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If all of the data has been loaded, fill the fingerprint and clean up. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gpu_data_manager_->IsCompleteGpuInfoAvailable() && 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fonts_ && 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !waiting_on_plugins_ && 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (geoposition_.Validate() || 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geoposition_.error_code != content::Geoposition::ERROR_CODE_NONE)) { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFingerprint(); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FingerprintDataLoader::FillFingerprint() { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Fingerprint> fingerprint(new Fingerprint); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::MachineCharacteristics* machine = 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fingerprint->mutable_machine_characteristics(); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_operating_system_build(GetOperatingSystemVersion()); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the delta between the install time and the Unix epoch, in hours. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_browser_install_time_hours( 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (install_time_ - base::Time::UnixEpoch()).InHours()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_utc_offset_ms(GetTimezoneOffset().InMilliseconds()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_browser_language(app_locale_); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_charset(charset_); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_user_agent(content::GetUserAgent(GURL())); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_ram(base::SysInfo::AmountOfPhysicalMemory()); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_browser_build(version_); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) machine->set_browser_feature(DialogTypeToBrowserFeature(dialog_type_)); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddFontsToFingerprint(*fonts_, machine); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPluginsToFingerprint(plugins_, machine); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddAcceptLanguagesToFingerprint(accept_languages_, machine); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddScreenInfoToFingerprint(screen_info_, machine); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddCpuInfoToFingerprint(machine); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddGpuInfoToFingerprint(machine); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(isherman): Record the user_and_device_name_hash. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(isherman): Record the partition size of the hard drives? 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::TransientState* transient_state = 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fingerprint->mutable_transient_state(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::Dimension* inner_window_size = 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transient_state->mutable_inner_window_size(); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inner_window_size->set_width(content_bounds_.width()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inner_window_size->set_height(content_bounds_.height()); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::Dimension* outer_window_size = 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transient_state->mutable_outer_window_size(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outer_window_size->set_width(window_bounds_.width()); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outer_window_size->set_height(window_bounds_.height()); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(isherman): Record network performance data, which is theoretically 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // available to JS. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(isherman): Record more user behavior data. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (geoposition_.error_code == content::Geoposition::ERROR_CODE_NONE) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::UserCharacteristics::Location* location = 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fingerprint->mutable_user_characteristics()->mutable_location(); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location->set_altitude(geoposition_.altitude); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location->set_latitude(geoposition_.latitude); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location->set_longitude(geoposition_.longitude); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location->set_accuracy(geoposition_.accuracy); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location->set_time_in_ms( 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (geoposition_.timestamp - base::Time::UnixEpoch()).InMilliseconds()); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fingerprint::Metadata* metadata = fingerprint->mutable_metadata(); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata->set_timestamp_ms( 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (base::Time::Now() - base::Time::UnixEpoch()).InMilliseconds()); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata->set_obfuscated_gaia_id(obfuscated_gaia_id_); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata->set_fingerprinter_version(kFingerprinterVersion); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Run(fingerprint.Pass()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetFingerprintInternal( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 obfuscated_gaia_id, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& window_bounds, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& content_bounds, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebScreenInfo& screen_info, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& version, 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& charset, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& accept_languages, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& install_time, 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DialogType dialog_type, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& app_locale, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Begin loading all of the data that we need to load asynchronously. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This class is responsible for freeing its own memory. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new FingerprintDataLoader(obfuscated_gaia_id, window_bounds, content_bounds, 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_info, version, charset, accept_languages, 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_time, dialog_type, app_locale, callback); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetFingerprint( 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 obfuscated_gaia_id, 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& window_bounds, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::WebContents& web_contents, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& version, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& charset, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& accept_languages, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& install_time, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DialogType dialog_type, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& app_locale, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(scoped_ptr<Fingerprint>)>& callback) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect content_bounds; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents.GetView()->GetContainerBounds(&content_bounds); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebScreenInfo screen_info; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderWidgetHostView* host_view = 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents.GetRenderWidgetHostView(); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host_view) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_view->GetRenderWidgetHost()->GetWebScreenInfo(&screen_info); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::GetFingerprintInternal( 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obfuscated_gaia_id, window_bounds, content_bounds, screen_info, version, 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) charset, accept_languages, install_time, dialog_type, app_locale, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace risk 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace autofill 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)