| Index: chrome/browser/ui/intents/web_intent_picker_controller.cc
|
| ===================================================================
|
| --- chrome/browser/ui/intents/web_intent_picker_controller.cc (revision 98890)
|
| +++ chrome/browser/ui/intents/web_intent_picker_controller.cc (working copy)
|
| @@ -1,264 +0,0 @@
|
| -// Copyright (c) 2011 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/intents/web_intent_picker_controller.h"
|
| -
|
| -#include <vector>
|
| -
|
| -#include "chrome/browser/favicon/favicon_service.h"
|
| -#include "chrome/browser/intents/web_intent_data.h"
|
| -#include "chrome/browser/intents/web_intents_registry.h"
|
| -#include "chrome/browser/intents/web_intents_registry_factory.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/ui/intents/web_intent_picker.h"
|
| -#include "chrome/browser/ui/intents/web_intent_picker_factory.h"
|
| -#include "chrome/browser/webdata/web_data_service.h"
|
| -#include "content/browser/tab_contents/tab_contents.h"
|
| -#include "content/common/notification_source.h"
|
| -#include "ui/gfx/codec/png_codec.h"
|
| -
|
| -namespace {
|
| -
|
| -// Gets the favicon service for the profile in |tab_contents|.
|
| -FaviconService* GetFaviconService(TabContents* tab_contents) {
|
| - Profile* profile = Profile::FromBrowserContext(
|
| - tab_contents->browser_context());
|
| - return profile->GetFaviconService(Profile::EXPLICIT_ACCESS);
|
| -}
|
| -
|
| -// Gets the web intents registry for the profile in |tab_contents|.
|
| -WebIntentsRegistry* GetWebIntentsRegistry(TabContents* tab_contents) {
|
| - Profile* profile = Profile::FromBrowserContext(
|
| - tab_contents->browser_context());
|
| - return WebIntentsRegistryFactory::GetForProfile(profile);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// A class that asynchronously fetches web intent data from the web intents
|
| -// registry.
|
| -class WebIntentPickerController::WebIntentDataFetcher
|
| - : public WebIntentsRegistry::Consumer {
|
| - public:
|
| - WebIntentDataFetcher(WebIntentPickerController* controller,
|
| - WebIntentsRegistry* web_intents_registry);
|
| - ~WebIntentDataFetcher();
|
| -
|
| - // Asynchronously fetches WebIntentData for the given |action| |type| pair.
|
| - void Fetch(const string16& action, const string16& type);
|
| -
|
| - // Cancels the WebDataService request.
|
| - void Cancel();
|
| -
|
| - private:
|
| - // WebIntentsRegistry::Consumer implementation.
|
| - virtual void OnIntentsQueryDone(
|
| - WebIntentsRegistry::QueryID,
|
| - const std::vector<WebIntentData>& intents) OVERRIDE;
|
| -
|
| - // A weak pointer to the picker controller.
|
| - WebIntentPickerController* controller_;
|
| -
|
| - // A weak pointer to the web intents registry.
|
| - WebIntentsRegistry* web_intents_registry_;
|
| -
|
| - // The ID of the current web intents request. The value will be -1 if
|
| - // there is no request in flight.
|
| - WebIntentsRegistry::QueryID query_id_;
|
| -};
|
| -
|
| -// A class that asynchronously fetches favicons for a vector of URLs.
|
| -class WebIntentPickerController::FaviconFetcher {
|
| - public:
|
| - FaviconFetcher(WebIntentPickerController* controller,
|
| - FaviconService *favicon_service);
|
| - ~FaviconFetcher();
|
| -
|
| - // Asynchronously fetches favicons for the each URL in |urls|.
|
| - void Fetch(const std::vector<GURL>& urls);
|
| -
|
| - // Cancels all favicon requests.
|
| - void Cancel();
|
| -
|
| - private:
|
| - // Callback called when a favicon is received.
|
| - void OnFaviconDataAvailable(FaviconService::Handle handle,
|
| - history::FaviconData favicon_data);
|
| -
|
| - // A weak pointer to the picker controller.
|
| - WebIntentPickerController* controller_;
|
| -
|
| - // A weak pointer to the favicon service.
|
| - FaviconService* favicon_service_;
|
| -
|
| - // The Consumer to handle asynchronous favicon requests.
|
| - CancelableRequestConsumerTSimple<size_t> load_consumer_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FaviconFetcher);
|
| -};
|
| -
|
| -WebIntentPickerController::WebIntentPickerController(
|
| - TabContents* tab_contents,
|
| - WebIntentPickerFactory* factory)
|
| - : tab_contents_(tab_contents),
|
| - picker_factory_(factory),
|
| - web_intent_data_fetcher_(
|
| - new WebIntentDataFetcher(this,
|
| - GetWebIntentsRegistry(tab_contents))),
|
| - favicon_fetcher_(
|
| - new FaviconFetcher(this, GetFaviconService(tab_contents))),
|
| - picker_(NULL),
|
| - pending_async_count_(0) {
|
| - NavigationController* controller = &tab_contents->controller();
|
| - registrar_.Add(this, content::NOTIFICATION_LOAD_START,
|
| - Source<NavigationController>(controller));
|
| - registrar_.Add(this, content::NOTIFICATION_TAB_CLOSING,
|
| - Source<NavigationController>(controller));
|
| -}
|
| -
|
| -WebIntentPickerController::~WebIntentPickerController() {
|
| -}
|
| -
|
| -void WebIntentPickerController::ShowDialog(const string16& action,
|
| - const string16& type) {
|
| - if (picker_ != NULL)
|
| - return;
|
| -
|
| - picker_ = picker_factory_->Create(tab_contents_, this);
|
| -
|
| - // TODO(binji) Remove this check when there are implementations of the picker
|
| - // for windows and mac.
|
| - if (picker_ == NULL)
|
| - return;
|
| -
|
| - web_intent_data_fetcher_->Fetch(action, type);
|
| -}
|
| -
|
| -void WebIntentPickerController::Observe(int type,
|
| - const NotificationSource& source,
|
| - const NotificationDetails& details) {
|
| - DCHECK(type == content::NOTIFICATION_LOAD_START ||
|
| - type == content::NOTIFICATION_TAB_CLOSING);
|
| - ClosePicker();
|
| -}
|
| -
|
| -void WebIntentPickerController::OnServiceChosen(size_t index) {
|
| - DCHECK(index < urls_.size());
|
| -
|
| - // TODO(binji) Send the chosen service back to the renderer.
|
| - LOG(INFO) << "Chose index: " << index << " url: " << urls_[index];
|
| - ClosePicker();
|
| -}
|
| -
|
| -void WebIntentPickerController::OnCancelled() {
|
| - // TODO(binji) Tell the renderer that the intent was cancelled.
|
| - ClosePicker();
|
| -}
|
| -
|
| -void WebIntentPickerController::OnWebIntentDataAvailable(
|
| - const std::vector<WebIntentData>& intent_data) {
|
| - urls_.clear();
|
| - for (size_t i = 0; i < intent_data.size(); ++i) {
|
| - urls_.push_back(intent_data[i].service_url);
|
| - }
|
| -
|
| - // Tell the picker to initialize N urls to the default favicon
|
| - picker_->SetServiceURLs(urls_);
|
| - favicon_fetcher_->Fetch(urls_);
|
| - pending_async_count_--;
|
| -}
|
| -
|
| -void WebIntentPickerController::OnFaviconDataAvailable(
|
| - size_t index,
|
| - const SkBitmap& icon_bitmap) {
|
| - picker_->SetServiceIcon(index, icon_bitmap);
|
| - pending_async_count_--;
|
| -}
|
| -
|
| -void WebIntentPickerController::OnFaviconDataUnavailable(size_t index) {
|
| - picker_->SetDefaultServiceIcon(index);
|
| - pending_async_count_--;
|
| -}
|
| -
|
| -void WebIntentPickerController::ClosePicker() {
|
| - if (picker_) {
|
| - picker_factory_->ClosePicker(picker_);
|
| - picker_ = NULL;
|
| - }
|
| -}
|
| -
|
| -WebIntentPickerController::WebIntentDataFetcher::WebIntentDataFetcher(
|
| - WebIntentPickerController* controller,
|
| - WebIntentsRegistry* web_intents_registry)
|
| - : controller_(controller),
|
| - web_intents_registry_(web_intents_registry),
|
| - query_id_(-1) {
|
| -}
|
| -
|
| -WebIntentPickerController::WebIntentDataFetcher::~WebIntentDataFetcher() {
|
| -}
|
| -
|
| -void WebIntentPickerController::WebIntentDataFetcher::Fetch(
|
| - const string16& action,
|
| - const string16& type) {
|
| - DCHECK(query_id_ == -1) << "Fetch already in process.";
|
| - controller_->pending_async_count_++;
|
| - query_id_ = web_intents_registry_->GetIntentProviders(action, this);
|
| -}
|
| -
|
| -void WebIntentPickerController::WebIntentDataFetcher::OnIntentsQueryDone(
|
| - WebIntentsRegistry::QueryID,
|
| - const std::vector<WebIntentData>& intents) {
|
| - controller_->OnWebIntentDataAvailable(intents);
|
| - query_id_ = -1;
|
| -}
|
| -
|
| -WebIntentPickerController::FaviconFetcher::FaviconFetcher(
|
| - WebIntentPickerController* controller,
|
| - FaviconService* favicon_service)
|
| - : controller_(controller),
|
| - favicon_service_(favicon_service) {
|
| -}
|
| -
|
| -WebIntentPickerController::FaviconFetcher::~FaviconFetcher() {
|
| -}
|
| -
|
| -void WebIntentPickerController::FaviconFetcher::Fetch(
|
| - const std::vector<GURL>& urls) {
|
| - if (!favicon_service_)
|
| - return;
|
| -
|
| - for (size_t index = 0; index < urls.size(); ++index) {
|
| - controller_->pending_async_count_++;
|
| - FaviconService::Handle handle = favicon_service_->GetFaviconForURL(
|
| - urls[index],
|
| - history::FAVICON,
|
| - &load_consumer_,
|
| - NewCallback(this, &WebIntentPickerController::FaviconFetcher::
|
| - OnFaviconDataAvailable));
|
| - load_consumer_.SetClientData(favicon_service_, handle, index);
|
| - }
|
| -}
|
| -
|
| -void WebIntentPickerController::FaviconFetcher::Cancel() {
|
| - load_consumer_.CancelAllRequests();
|
| -}
|
| -
|
| -void WebIntentPickerController::FaviconFetcher::OnFaviconDataAvailable(
|
| - FaviconService::Handle handle,
|
| - history::FaviconData favicon_data) {
|
| - size_t index = load_consumer_.GetClientDataForCurrentRequest();
|
| - if (favicon_data.is_valid()) {
|
| - SkBitmap icon_bitmap;
|
| -
|
| - if (gfx::PNGCodec::Decode(favicon_data.image_data->front(),
|
| - favicon_data.image_data->size(),
|
| - &icon_bitmap)) {
|
| - controller_->OnFaviconDataAvailable(index, icon_bitmap);
|
| - return;
|
| - }
|
| - }
|
| -
|
| - controller_->OnFaviconDataUnavailable(index);
|
| -}
|
|
|