// 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.
#ifndef CHROME_BROWSER_UI_WEBUI_FAVICON_SOURCE_H_
#define CHROME_BROWSER_UI_WEBUI_FAVICON_SOURCE_H_
#include <map>
#include <string>
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/favicon/favicon_service.h"
#include "chrome/common/cancelable_task_tracker.h"
#include "content/public/browser/url_data_source.h"
#include "ui/gfx/favicon_size.h"
class Profile;
// FaviconSource is the gateway between network-level chrome:
// requests for favicons and the history backend that serves these.
//
// Format:
// chrome://favicon/size&scalefactor/urlmodifier/url
// Some parameters are optional as described below. However, the order of the
// parameters is not interchangeable.
//
// Parameter:
// 'url' Required
// Specifies the page URL of the requested favicon. If the 'urlmodifier'
// parameter is 'iconurl', the URL refers to the URL of the favicon image
// instead.
// 'size&scalefactor' Optional
// Values: ['largest', size/aa@bx/]
// 'largest': Specifies that the largest available favicon is requested.
// Example: chrome://favicon/largest/http://www.google.com/
// 'size/aa@bx/':
// Specifies the requested favicon's size in DIP (aa) and the requested
// favicon's scale factor. (b).
// The supported requested DIP sizes are: 16x16, 32x32 and 64x64.
// If the parameter is unspecified, the requested favicon's size defaults
// to 16 and the requested scale factor defaults to 1x.
// Example: chrome://favicon/size/16@2x/http://www.google.com/
// 'urlmodifier' Optional
// Values: ['iconurl', 'origin']
// 'iconurl': Specifies that the url parameter refers to the URL of
// the favicon image as opposed to the URL of the page that the favicon is
// on.
// Example: chrome://favicon/iconurl/http://www.google.com/favicon.ico
// 'origin': Specifies that the URL should be converted to a form with
// an empty path and a valid scheme. The converted URL will be used to
// request the favicon from the favicon service.
// Examples:
// chrome://favicon/origin/http://example.com/a
// chrome://favicon/origin/example.com
// Both URLs request the favicon for http://example.com from the
// favicon service.
class FaviconSource : public content::URLDataSource {
public:
// Defines the type of icon the FaviconSource will provide.
enum IconType {
FAVICON,
// Any available icon in the priority of TOUCH_ICON_PRECOMPOSED, TOUCH_ICON,
// FAVICON, and default favicon.
ANY
};
// |type| is the type of icon this FaviconSource will provide.
FaviconSource(Profile* profile, IconType type);
virtual ~FaviconSource();
// content::URLDataSource implementation.
virtual std::string GetSource() const OVERRIDE;
virtual void StartDataRequest(
const std::string& path,
int render_process_id,
int render_view_id,
const content::URLDataSource::GotDataCallback& callback) OVERRIDE;
virtual std::string GetMimeType(const std::string&) const OVERRIDE;
virtual bool ShouldReplaceExistingSource() const OVERRIDE;
virtual bool ShouldServiceRequest(
const net::URLRequest* request) const OVERRIDE;
protected:
struct IconRequest {
IconRequest();
IconRequest(const content::URLDataSource::GotDataCallback& cb,
const GURL& path,
int size,
ui::ScaleFactor scale);
~IconRequest();
content::URLDataSource::GotDataCallback callback;
GURL request_path;
int size_in_dip;
ui::ScaleFactor scale_factor;
};
// Called when the favicon data is missing to perform additional checks to
// locate the resource.
// |request| contains information for the failed request.
// Returns true if the missing resource is found.
virtual bool HandleMissingResource(const IconRequest& request);
Profile* profile_;
private:
FRIEND_TEST_ALL_PREFIXES(FaviconSourceTest, InstantParsing);
FRIEND_TEST_ALL_PREFIXES(FaviconSourceTest, Parsing);
// Defines the allowed pixel sizes for requested favicons.
enum IconSize {
SIZE_16,
SIZE_32,
SIZE_64,
NUM_SIZES
};
// Called when favicon data is available from the history backend.
void OnFaviconDataAvailable(
const IconRequest& request,
const chrome::FaviconBitmapResult& bitmap_result);
// Sends the 16x16 DIP 1x default favicon.
void SendDefaultResponse(
const content::URLDataSource::GotDataCallback& callback);
// Sends the default favicon.
void SendDefaultResponse(const IconRequest& request);
CancelableTaskTracker cancelable_task_tracker_;
// Raw PNG representations of favicons of each size to show when the favicon
// database doesn't have a favicon for a webpage. Indexed by IconSize values.
scoped_refptr<base::RefCountedMemory> default_favicons_[NUM_SIZES];
// The chrome::IconTypes of icon that this FaviconSource handles.
int icon_types_;
DISALLOW_COPY_AND_ASSIGN(FaviconSource);
};
#endif // CHROME_BROWSER_UI_WEBUI_FAVICON_SOURCE_H_