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)