| Index: chrome/browser/intents/cws_intents_registry.cc
|
| diff --git a/chrome/browser/intents/cws_intents_registry.cc b/chrome/browser/intents/cws_intents_registry.cc
|
| deleted file mode 100644
|
| index 42114995576bbd21282bd195088cd2804e5cdf76..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/intents/cws_intents_registry.cc
|
| +++ /dev/null
|
| @@ -1,235 +0,0 @@
|
| -// 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/intents/cws_intents_registry.h"
|
| -
|
| -#include "base/callback.h"
|
| -#include "base/json/json_string_value_serializer.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/stl_util.h"
|
| -#include "base/string16.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "chrome/common/extensions/extension_l10n_util.h"
|
| -#include "chrome/common/extensions/message_bundle.h"
|
| -#include "chrome/browser/net/chrome_url_request_context.h"
|
| -#include "chrome/browser/webdata/web_data_service.h"
|
| -#include "google_apis/google_api_keys.h"
|
| -#include "net/base/load_flags.h"
|
| -#include "net/base/mime_util.h"
|
| -#include "net/base/url_util.h"
|
| -#include "net/url_request/url_fetcher.h"
|
| -
|
| -namespace {
|
| -
|
| -// Limit for the number of suggestions we fix from CWS. Ideally, the registry
|
| -// simply get all of them, but there is a) chunking on the CWS side, and b)
|
| -// there is a cost with suggestions fetched. (Network overhead for favicons,
|
| -// roundtrips to registry to check if installed).
|
| -//
|
| -// Since the picker limits the number of suggestions displayed to 5, 15 means
|
| -// the suggestion list only has the potential to be shorter than that once the
|
| -// user has at least 10 installed handlers for the particular action/type.
|
| -//
|
| -// TODO(groby): Adopt number of suggestions dynamically so the picker can
|
| -// always display 5 suggestions unless there are less than 5 viable extensions
|
| -// in the CWS.
|
| -const char kMaxSuggestions[] = "15";
|
| -
|
| -// URL for CWS intents API.
|
| -const char kCWSIntentServiceURL[] =
|
| - "https://www.googleapis.com/chromewebstore/v1.1b/items/intent";
|
| -
|
| -// Determines if a string is a candidate for localization.
|
| -bool ShouldLocalize(const std::string& value) {
|
| - std::string::size_type index = 0;
|
| - index = value.find(extensions::MessageBundle::kMessageBegin);
|
| - if (index == std::string::npos)
|
| - return false;
|
| -
|
| - index = value.find(extensions::MessageBundle::kMessageEnd, index);
|
| - return (index != std::string::npos);
|
| -}
|
| -
|
| -// Parses a JSON |response| from the CWS into a list of suggested extensions,
|
| -// stored in |intents|. |intents| must not be NULL.
|
| -void ParseResponse(const std::string& response,
|
| - CWSIntentsRegistry::IntentExtensionList* intents) {
|
| - std::string error;
|
| - scoped_ptr<Value> parsed_response;
|
| - JSONStringValueSerializer serializer(response);
|
| - parsed_response.reset(serializer.Deserialize(NULL, &error));
|
| - if (parsed_response.get() == NULL)
|
| - return;
|
| -
|
| - DictionaryValue* response_dict = NULL;
|
| - if (!parsed_response->GetAsDictionary(&response_dict) || !response_dict)
|
| - return;
|
| -
|
| - ListValue* items;
|
| - if (!response_dict->GetList("items", &items))
|
| - return;
|
| -
|
| - for (ListValue::const_iterator iter(items->begin());
|
| - iter != items->end(); ++iter) {
|
| - DictionaryValue* item = static_cast<DictionaryValue*>(*iter);
|
| -
|
| - // All fields are mandatory - skip this result if any field isn't found.
|
| - CWSIntentsRegistry::IntentExtensionInfo info;
|
| - if (!item->GetString("id", &info.id))
|
| - continue;
|
| -
|
| - if (!item->GetInteger("num_ratings", &info.num_ratings))
|
| - continue;
|
| -
|
| - if (!item->GetDouble("average_rating", &info.average_rating))
|
| - continue;
|
| -
|
| - if (!item->GetString("manifest", &info.manifest))
|
| - continue;
|
| -
|
| - std::string manifest_utf8 = UTF16ToUTF8(info.manifest);
|
| - JSONStringValueSerializer manifest_serializer(manifest_utf8);
|
| - scoped_ptr<Value> manifest_value;
|
| - manifest_value.reset(manifest_serializer.Deserialize(NULL, &error));
|
| - if (manifest_value.get() == NULL)
|
| - continue;
|
| -
|
| - DictionaryValue* manifest_dict;
|
| - if (!manifest_value->GetAsDictionary(&manifest_dict) ||
|
| - !manifest_dict->GetString("name", &info.name))
|
| - continue;
|
| -
|
| - string16 url_string;
|
| - if (!item->GetString("icon_url", &url_string))
|
| - continue;
|
| - info.icon_url = GURL(url_string);
|
| -
|
| - // Need to parse CWS reply, since it is not pre-l10n'd.
|
| - ListValue* all_locales = NULL;
|
| - if (ShouldLocalize(UTF16ToUTF8(info.name)) &&
|
| - item->GetList("locale_data", &all_locales)) {
|
| - std::map<std::string, std::string> localized_title;
|
| -
|
| - for (ListValue::const_iterator locale_iter(all_locales->begin());
|
| - locale_iter != all_locales->end(); ++locale_iter) {
|
| - DictionaryValue* locale = static_cast<DictionaryValue*>(*locale_iter);
|
| -
|
| - std::string locale_id, title;
|
| - if (!locale->GetString("locale_string", &locale_id) ||
|
| - !locale->GetString("title", &title))
|
| - continue;
|
| -
|
| - localized_title[locale_id] = title;
|
| - }
|
| -
|
| - std::vector<std::string> valid_locales;
|
| - extension_l10n_util::GetAllFallbackLocales(
|
| - extension_l10n_util::CurrentLocaleOrDefault(),
|
| - "all",
|
| - &valid_locales);
|
| - for (std::vector<std::string>::iterator iter = valid_locales.begin();
|
| - iter != valid_locales.end(); ++iter) {
|
| - if (localized_title.count(*iter)) {
|
| - info.name = UTF8ToUTF16(localized_title[*iter]);
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - intents->push_back(info);
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// Internal object representing all data associated with a single query.
|
| -struct CWSIntentsRegistry::IntentsQuery {
|
| - IntentsQuery();
|
| - ~IntentsQuery();
|
| -
|
| - // Underlying URL request query.
|
| - scoped_ptr<net::URLFetcher> url_fetcher;
|
| -
|
| - // The callback - invoked on completed retrieval.
|
| - ResultsCallback callback;
|
| -};
|
| -
|
| -CWSIntentsRegistry::IntentsQuery::IntentsQuery() {
|
| -}
|
| -
|
| -CWSIntentsRegistry::IntentsQuery::~IntentsQuery() {
|
| -}
|
| -
|
| -CWSIntentsRegistry::IntentExtensionInfo::IntentExtensionInfo()
|
| - : num_ratings(0),
|
| - average_rating(0) {
|
| -}
|
| -
|
| -CWSIntentsRegistry::IntentExtensionInfo::~IntentExtensionInfo() {
|
| -}
|
| -
|
| -CWSIntentsRegistry::CWSIntentsRegistry(net::URLRequestContextGetter* context)
|
| - : request_context_(context) {
|
| -}
|
| -
|
| -CWSIntentsRegistry::~CWSIntentsRegistry() {
|
| - // Cancel all pending queries, since we can't handle them any more.
|
| - STLDeleteValues(&queries_);
|
| -}
|
| -
|
| -void CWSIntentsRegistry::OnURLFetchComplete(const net::URLFetcher* source) {
|
| - DCHECK(source);
|
| -
|
| - URLFetcherHandle handle = reinterpret_cast<URLFetcherHandle>(source);
|
| - QueryMap::iterator it = queries_.find(handle);
|
| - DCHECK(it != queries_.end());
|
| - scoped_ptr<IntentsQuery> query(it->second);
|
| - DCHECK(query.get() != NULL);
|
| - queries_.erase(it);
|
| -
|
| - std::string response;
|
| - source->GetResponseAsString(&response);
|
| -
|
| - // TODO(groby): Do we really only accept 200, or any 2xx codes?
|
| - IntentExtensionList intents;
|
| - if (source->GetResponseCode() == 200)
|
| - ParseResponse(response, &intents);
|
| -
|
| - if (!query->callback.is_null())
|
| - query->callback.Run(intents);
|
| -}
|
| -
|
| -void CWSIntentsRegistry::GetIntentServices(const string16& action,
|
| - const string16& mimetype,
|
| - const ResultsCallback& cb) {
|
| - scoped_ptr<IntentsQuery> query(new IntentsQuery);
|
| - query->callback = cb;
|
| - query->url_fetcher.reset(net::URLFetcher::Create(
|
| - 0, BuildQueryURL(action,mimetype), net::URLFetcher::GET, this));
|
| -
|
| - if (query->url_fetcher.get() == NULL)
|
| - return;
|
| -
|
| - query->url_fetcher->SetRequestContext(request_context_);
|
| - query->url_fetcher->SetLoadFlags(
|
| - net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES);
|
| -
|
| - URLFetcherHandle handle = reinterpret_cast<URLFetcherHandle>(
|
| - query->url_fetcher.get());
|
| - queries_[handle] = query.release();
|
| - queries_[handle]->url_fetcher->Start();
|
| -}
|
| -
|
| -// static
|
| -GURL CWSIntentsRegistry::BuildQueryURL(const string16& action,
|
| - const string16& type) {
|
| - GURL request(kCWSIntentServiceURL);
|
| - request = net::AppendQueryParameter(request, "intent", UTF16ToUTF8(action));
|
| - request = net::AppendQueryParameter(request, "mime_types", UTF16ToUTF8(type));
|
| - request = net::AppendQueryParameter(request, "start_index", "0");
|
| - request = net::AppendQueryParameter(request, "num_results", kMaxSuggestions);
|
| - request = net::AppendQueryParameter(request, "key", google_apis::GetAPIKey());
|
| -
|
| - return request;
|
| -}
|
|
|