summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/webui/fallback_icon_source.h
blob: bba497267891d14c4700d207df84070d37f17a73 (plain)
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
// Copyright 2015 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_FALLBACK_ICON_SOURCE_H_
#define CHROME_BROWSER_UI_WEBUI_FALLBACK_ICON_SOURCE_H_

#include <string>

#include "base/memory/scoped_ptr.h"
#include "content/public/browser/url_data_source.h"

class GURL;

namespace favicon_base {
struct FallbackIconStyle;
}

namespace favicon {
class FallbackIconService;
}

// FallbackIconSource services explicit chrome:// requests for fallback icons.
//
// Format:
//   chrome://fallback-icon/size,bc,tc,fsr,r/url
// All of the parameters except for the url are optional. However, the order of
// the parameters is not interchangeable, and all "," must be in place.
//
// Parameter:
//  'size'
//    Positive integer to specify the fallback icon's size in pixels.
//  'bc'
//    Fallback icon's background color, as named CSS color, or RGB / ARGB /
//    RRGGBB / AARRGGBB hex formats (no leading "#").
//  'tc'
//    Fallback icon text color, as named CSS color, or RGB / ARGB / RRGGBB /
//    AARRGGBB hex formats (no leading "#").
//  'fsr'
//    Number in [0.0, 1.0] to specify the fallback icon's font size (pixels)
//    as a ratio to the icon's size.
//  'r'
//    Number in [0.0, 1.0] to specify the fallback icon's roundness.
//    0.0 specifies a square icon; 1.0 specifies a circle icon; intermediate
//    values specify a rounded square icon.
//  'url'
//    String to specify the page URL of the fallback icon.
//
//  Example: chrome://fallback-icon/32,red,#000,0.5,1.0/http://www.google.com/
//    This requests a 32x32 fallback icon for http://www.google.com, using
//    red as the background color, #000 as the text color, with font size of
//    32 * 0.5 = 16, and the icon's background shape is a circle.
class FallbackIconSource : public content::URLDataSource {
 public:
  // |fallback_icon_service| is owned by caller, and may be null.
  explicit FallbackIconSource(
      favicon::FallbackIconService* fallback_icon_service);

  ~FallbackIconSource() 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;

 private:
  void SendFallbackIconHelper(
      const GURL& url,
      int size_in_pixels,
      const favicon_base::FallbackIconStyle& style,
      const content::URLDataSource::GotDataCallback& callback);

  // Sends the default fallback icon.
  void SendDefaultResponse(
      const content::URLDataSource::GotDataCallback& callback);

  favicon::FallbackIconService* fallback_icon_service_;

  DISALLOW_COPY_AND_ASSIGN(FallbackIconSource);
};

#endif  // CHROME_BROWSER_UI_WEBUI_FALLBACK_ICON_SOURCE_H_