blob: 9f11e0cf27b101c63ac7514c9e2858416fbea5c4 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/predictors/predictors_handler.h"
#include "base/bind.h"
#include "base/values.h"
#include "chrome/browser/predictors/autocomplete_action_predictor.h"
#include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
#include "chrome/browser/predictors/resource_prefetch_predictor.h"
#include "chrome/browser/predictors/resource_prefetch_predictor_factory.h"
#include "chrome/browser/predictors/resource_prefetch_predictor_tables.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/web_ui.h"
#include "webkit/glue/resource_type.h"
using predictors::AutocompleteActionPredictor;
using predictors::ResourcePrefetchPredictor;
using predictors::ResourcePrefetchPredictorTables;
namespace {
std::string ConvertResourceType(ResourceType::Type type) {
switch (type) {
case ResourceType::IMAGE:
return "Image";
case ResourceType::STYLESHEET:
return "Stylesheet";
case ResourceType::SCRIPT:
return "Script";
default:
return "Unknown";
}
}
} // namespace
PredictorsHandler::PredictorsHandler(Profile* profile) {
autocomplete_action_predictor_ =
predictors::AutocompleteActionPredictorFactory::GetForProfile(profile);
resource_prefetch_predictor_ =
predictors::ResourcePrefetchPredictorFactory::GetForProfile(profile);
}
PredictorsHandler::~PredictorsHandler() { }
void PredictorsHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback("requestAutocompleteActionPredictorDb",
base::Bind(&PredictorsHandler::RequestAutocompleteActionPredictorDb,
base::Unretained(this)));
web_ui()->RegisterMessageCallback("requestResourcePrefetchPredictorDb",
base::Bind(&PredictorsHandler::RequestResourcePrefetchPredictorDb,
base::Unretained(this)));
}
void PredictorsHandler::RequestAutocompleteActionPredictorDb(
const base::ListValue* args) {
const bool enabled = (autocomplete_action_predictor_ != NULL);
base::DictionaryValue dict;
dict.SetBoolean("enabled", enabled);
if (enabled) {
base::ListValue* db = new base::ListValue();
for (AutocompleteActionPredictor::DBCacheMap::const_iterator it =
autocomplete_action_predictor_->db_cache_.begin();
it != autocomplete_action_predictor_->db_cache_.end();
++it) {
base::DictionaryValue* entry = new base::DictionaryValue();
entry->SetString("user_text", it->first.user_text);
entry->SetString("url", it->first.url.spec());
entry->SetInteger("hit_count", it->second.number_of_hits);
entry->SetInteger("miss_count", it->second.number_of_misses);
entry->SetDouble("confidence",
autocomplete_action_predictor_->CalculateConfidenceForDbEntry(it));
db->Append(entry);
}
dict.Set("db", db);
}
web_ui()->CallJavascriptFunction("updateAutocompleteActionPredictorDb", dict);
}
void PredictorsHandler::RequestResourcePrefetchPredictorDb(
const base::ListValue* args) {
const bool enabled = (resource_prefetch_predictor_ != NULL);
base::DictionaryValue dict;
dict.SetBoolean("enabled", enabled);
if (enabled) {
// Url Database cache.
base::ListValue* db = new base::ListValue();
for (ResourcePrefetchPredictor::UrlTableCacheMap::const_iterator it =
resource_prefetch_predictor_->url_table_cache_.begin();
it != resource_prefetch_predictor_->url_table_cache_.end();
++it) {
base::DictionaryValue* main = new base::DictionaryValue();
main->SetString("main_frame_url", it->first.spec());
base::ListValue* resources = new base::ListValue();
for (ResourcePrefetchPredictor::UrlTableRowVector::const_iterator row =
it->second.rows.begin(); row != it->second.rows.end(); ++row) {
base::DictionaryValue* resource = new base::DictionaryValue();
resource->SetString("resource_url", row->resource_url.spec());
resource->SetString("resource_type",
ConvertResourceType(row->resource_type));
resource->SetInteger("number_of_hits", row->number_of_hits);
resource->SetInteger("number_of_misses", row->number_of_misses);
resource->SetInteger("consecutive_misses", row->consecutive_misses);
resource->SetDouble("position", row->average_position);
resource->SetDouble("score", row->score);
resources->Append(resource);
}
main->Set("resources", resources);
db->Append(main);
}
dict.Set("db", db);
}
web_ui()->CallJavascriptFunction("updateResourcePrefetchPredictorDb", dict);
}