1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
// 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 "base/task/cancelable_task_tracker.h"
#include "chrome/browser/favicon/favicon_service.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);
~FaviconSource() override;
// content::URLDataSource implementation.
std::string GetSource() const override;
void StartDataRequest(
const std::string& path,
int render_process_id,
int render_frame_id,
const content::URLDataSource::GotDataCallback& callback) override;
std::string GetMimeType(const std::string&) const override;
bool ShouldReplaceExistingSource() const override;
bool ShouldServiceRequest(const net::URLRequest* request) const override;
protected:
struct IconRequest {
IconRequest();
IconRequest(const content::URLDataSource::GotDataCallback& cb,
const GURL& path,
int size,
float scale);
~IconRequest();
content::URLDataSource::GotDataCallback callback;
GURL request_path;
int size_in_dip;
float device_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 favicon_base::FaviconRawBitmapResult& 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);
base::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 favicon_base::IconTypes of icon that this FaviconSource handles.
int icon_types_;
DISALLOW_COPY_AND_ASSIGN(FaviconSource);
};
#endif // CHROME_BROWSER_UI_WEBUI_FAVICON_SOURCE_H_
|