Home | History | Annotate | Download | only in predictors
      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 
     18 using predictors::AutocompleteActionPredictor;
     19 using predictors::ResourcePrefetchPredictor;
     20 using predictors::ResourcePrefetchPredictorTables;
     21 
     22 namespace {
     23 
     24 std::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 
     39 PredictorsHandler::PredictorsHandler(Profile* profile) {
     40   autocomplete_action_predictor_ =
     41       predictors::AutocompleteActionPredictorFactory::GetForProfile(profile);
     42   resource_prefetch_predictor_ =
     43       predictors::ResourcePrefetchPredictorFactory::GetForProfile(profile);
     44 }
     45 
     46 PredictorsHandler::~PredictorsHandler() { }
     47 
     48 void 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 
     57 void 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 
     83 void 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 
    105 void 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