15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)#include "chrome/browser/ui/webui/predictors/predictors_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/autocomplete_action_predictor.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/resource_prefetch_predictor.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/resource_prefetch_predictor_factory.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/resource_prefetch_predictor_tables.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "webkit/common/resource_type.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using predictors::AutocompleteActionPredictor;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using predictors::ResourcePrefetchPredictor;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using predictors::ResourcePrefetchPredictorTables;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ConvertResourceType(ResourceType::Type type) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ResourceType::IMAGE:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Image";
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ResourceType::STYLESHEET:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Stylesheet";
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ResourceType::SCRIPT:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Script";
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Unknown";
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PredictorsHandler::PredictorsHandler(Profile* profile) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  autocomplete_action_predictor_ =
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      predictors::AutocompleteActionPredictorFactory::GetForProfile(profile);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_prefetch_predictor_ =
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      predictors::ResourcePrefetchPredictorFactory::GetForProfile(profile);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PredictorsHandler::~PredictorsHandler() { }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PredictorsHandler::RegisterMessages() {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("requestAutocompleteActionPredictorDb",
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PredictorsHandler::RequestAutocompleteActionPredictorDb,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("requestResourcePrefetchPredictorDb",
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PredictorsHandler::RequestResourcePrefetchPredictorDb,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PredictorsHandler::RequestAutocompleteActionPredictorDb(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::ListValue* args) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool enabled = (autocomplete_action_predictor_ != NULL);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue dict;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("enabled", enabled);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enabled) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue* db = new base::ListValue();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (AutocompleteActionPredictor::DBCacheMap::const_iterator it =
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             autocomplete_action_predictor_->db_cache_.begin();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != autocomplete_action_predictor_->db_cache_.end();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++it) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::DictionaryValue* entry = new base::DictionaryValue();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry->SetString("user_text", it->first.user_text);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry->SetString("url", it->first.url.spec());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry->SetInteger("hit_count", it->second.number_of_hits);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry->SetInteger("miss_count", it->second.number_of_misses);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry->SetDouble("confidence",
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          autocomplete_action_predictor_->CalculateConfidenceForDbEntry(it));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->Append(entry);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set("db", db);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("updateAutocompleteActionPredictorDb", dict);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PredictorsHandler::RequestResourcePrefetchPredictorDb(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::ListValue* args) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool enabled = (resource_prefetch_predictor_ != NULL);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue dict;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetBoolean("enabled", enabled);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enabled) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Url Database cache.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue* db = new base::ListValue();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddPrefetchDataMapToListValue(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *resource_prefetch_predictor_->url_table_cache_, db);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dict.Set("url_db", db);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db = new base::ListValue();
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddPrefetchDataMapToListValue(
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *resource_prefetch_predictor_->host_table_cache_, db);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dict.Set("host_db", db);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("updateResourcePrefetchPredictorDb", dict);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PredictorsHandler::AddPrefetchDataMapToListValue(
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourcePrefetchPredictor::PrefetchDataMap& data_map,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ListValue* db) const {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (ResourcePrefetchPredictor::PrefetchDataMap::const_iterator it =
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       data_map.begin(); it != data_map.end(); ++it) {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::DictionaryValue* main = new base::DictionaryValue();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    main->SetString("main_frame_url", it->first);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::ListValue* resources = new base::ListValue();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (ResourcePrefetchPredictor::ResourceRows::const_iterator
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         row = it->second.resources.begin();
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         row != it->second.resources.end(); ++row) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::DictionaryValue* resource = new base::DictionaryValue();
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->SetString("resource_url", row->resource_url.spec());
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->SetString("resource_type",
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          ConvertResourceType(row->resource_type));
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->SetInteger("number_of_hits", row->number_of_hits);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->SetInteger("number_of_misses", row->number_of_misses);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->SetInteger("consecutive_misses", row->consecutive_misses);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->SetDouble("position", row->average_position);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->SetDouble("score", row->score);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resources->Append(resource);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    main->Set("resources", resources);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db->Append(main);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
131