1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/webui/predictors/predictors_handler.h"
6
7#include "base/bind.h"
8#include "base/values.h"
9#include "chrome/browser/predictors/autocomplete_action_predictor.h"
10#include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
11#include "chrome/browser/predictors/resource_prefetch_predictor.h"
12#include "chrome/browser/predictors/resource_prefetch_predictor_factory.h"
13#include "chrome/browser/predictors/resource_prefetch_predictor_tables.h"
14#include "chrome/browser/profiles/profile.h"
15#include "content/public/browser/web_ui.h"
16#include "content/public/common/resource_type.h"
17
18using predictors::AutocompleteActionPredictor;
19using predictors::ResourcePrefetchPredictor;
20using predictors::ResourcePrefetchPredictorTables;
21
22namespace {
23
24std::string ConvertResourceType(content::ResourceType type) {
25  switch (type) {
26    case content::RESOURCE_TYPE_IMAGE:
27      return "Image";
28    case content::RESOURCE_TYPE_STYLESHEET:
29      return "Stylesheet";
30    case content::RESOURCE_TYPE_SCRIPT:
31      return "Script";
32    default:
33      return "Unknown";
34  }
35}
36
37}  // namespace
38
39PredictorsHandler::PredictorsHandler(Profile* profile) {
40  autocomplete_action_predictor_ =
41      predictors::AutocompleteActionPredictorFactory::GetForProfile(profile);
42  resource_prefetch_predictor_ =
43      predictors::ResourcePrefetchPredictorFactory::GetForProfile(profile);
44}
45
46PredictorsHandler::~PredictorsHandler() { }
47
48void PredictorsHandler::RegisterMessages() {
49  web_ui()->RegisterMessageCallback("requestAutocompleteActionPredictorDb",
50      base::Bind(&PredictorsHandler::RequestAutocompleteActionPredictorDb,
51                 base::Unretained(this)));
52  web_ui()->RegisterMessageCallback("requestResourcePrefetchPredictorDb",
53      base::Bind(&PredictorsHandler::RequestResourcePrefetchPredictorDb,
54                 base::Unretained(this)));
55}
56
57void PredictorsHandler::RequestAutocompleteActionPredictorDb(
58    const base::ListValue* args) {
59  const bool enabled = (autocomplete_action_predictor_ != NULL);
60  base::DictionaryValue dict;
61  dict.SetBoolean("enabled", enabled);
62  if (enabled) {
63    base::ListValue* db = new base::ListValue();
64    for (AutocompleteActionPredictor::DBCacheMap::const_iterator it =
65             autocomplete_action_predictor_->db_cache_.begin();
66         it != autocomplete_action_predictor_->db_cache_.end();
67         ++it) {
68      base::DictionaryValue* entry = new base::DictionaryValue();
69      entry->SetString("user_text", it->first.user_text);
70      entry->SetString("url", it->first.url.spec());
71      entry->SetInteger("hit_count", it->second.number_of_hits);
72      entry->SetInteger("miss_count", it->second.number_of_misses);
73      entry->SetDouble("confidence",
74          autocomplete_action_predictor_->CalculateConfidenceForDbEntry(it));
75      db->Append(entry);
76    }
77    dict.Set("db", db);
78  }
79
80  web_ui()->CallJavascriptFunction("updateAutocompleteActionPredictorDb", dict);
81}
82
83void PredictorsHandler::RequestResourcePrefetchPredictorDb(
84    const base::ListValue* args) {
85  const bool enabled = (resource_prefetch_predictor_ != NULL);
86  base::DictionaryValue dict;
87  dict.SetBoolean("enabled", enabled);
88
89  if (enabled) {
90    // Url Database cache.
91    base::ListValue* db = new base::ListValue();
92    AddPrefetchDataMapToListValue(
93        *resource_prefetch_predictor_->url_table_cache_, db);
94    dict.Set("url_db", db);
95
96    db = new base::ListValue();
97    AddPrefetchDataMapToListValue(
98        *resource_prefetch_predictor_->host_table_cache_, db);
99    dict.Set("host_db", db);
100  }
101
102  web_ui()->CallJavascriptFunction("updateResourcePrefetchPredictorDb", dict);
103}
104
105void PredictorsHandler::AddPrefetchDataMapToListValue(
106    const ResourcePrefetchPredictor::PrefetchDataMap& data_map,
107    base::ListValue* db) const {
108  for (ResourcePrefetchPredictor::PrefetchDataMap::const_iterator it =
109       data_map.begin(); it != data_map.end(); ++it) {
110    base::DictionaryValue* main = new base::DictionaryValue();
111    main->SetString("main_frame_url", it->first);
112    base::ListValue* resources = new base::ListValue();
113    for (ResourcePrefetchPredictor::ResourceRows::const_iterator
114         row = it->second.resources.begin();
115         row != it->second.resources.end(); ++row) {
116      base::DictionaryValue* resource = new base::DictionaryValue();
117      resource->SetString("resource_url", row->resource_url.spec());
118      resource->SetString("resource_type",
119                          ConvertResourceType(row->resource_type));
120      resource->SetInteger("number_of_hits", row->number_of_hits);
121      resource->SetInteger("number_of_misses", row->number_of_misses);
122      resource->SetInteger("consecutive_misses", row->consecutive_misses);
123      resource->SetDouble("position", row->average_position);
124      resource->SetDouble("score", row->score);
125      resources->Append(resource);
126    }
127    main->Set("resources", resources);
128    db->Append(main);
129  }
130}
131