1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_RENDERER_IMAGE_LOADING_HELPER_H_
6#define CONTENT_RENDERER_IMAGE_LOADING_HELPER_H_
7
8#include <string>
9#include <vector>
10
11#include "base/memory/scoped_vector.h"
12#include "content/public/renderer/render_frame_observer.h"
13#include "url/gurl.h"
14
15class SkBitmap;
16
17namespace content {
18
19class MultiResolutionImageResourceFetcher;
20
21// This class deals with image downloading.
22// One instance of ImageLoadingHelper is owned by RenderFrame.
23class ImageLoadingHelper : public RenderFrameObserver {
24 public:
25  explicit ImageLoadingHelper(RenderFrame* render_frame);
26
27 private:
28  virtual ~ImageLoadingHelper();
29
30  // Message handler.
31  void OnDownloadImage(int id,
32                       const GURL& image_url,
33                       bool is_favicon,
34                       uint32_t max_image_size);
35
36  // Requests to download an image. When done, the ImageLoadingHelper
37  // is notified by way of DidDownloadImage. Returns true if the
38  // request was successfully started, false otherwise. id is used to
39  // uniquely identify the request and passed back to the
40  // DidDownloadImage method. If the image is a favicon, cookies will not be
41  // sent nor accepted during download. If the image has multiple frames, all
42  // the frames whose size <= |max_image_size| are returned. If all of the
43  // frames are larger than |max_image_size|, the smallest frame is resized to
44  // |max_image_size| and is the only result. |max_image_size| == 0 is
45  // interpreted as no max image size.
46  bool DownloadImage(int id,
47                     const GURL& image_url,
48                     bool is_favicon,
49                     uint32_t max_image_size);
50
51  // This callback is triggered when DownloadImage completes, either
52  // succesfully or with a failure. See DownloadImage for more
53  // details.
54  void DidDownloadImage(
55      uint32_t max_image_size,
56      MultiResolutionImageResourceFetcher* fetcher,
57      const std::vector<SkBitmap>& images);
58
59  // Decodes a data: URL image or returns an empty image in case of failure.
60  SkBitmap ImageFromDataUrl(const GURL&) const;
61
62  // RenderFrameObserver implementation.
63  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
64
65  typedef ScopedVector<MultiResolutionImageResourceFetcher>
66      ImageResourceFetcherList;
67
68  // ImageResourceFetchers schedule via DownloadImage.
69  ImageResourceFetcherList image_fetchers_;
70
71  DISALLOW_COPY_AND_ASSIGN(ImageLoadingHelper);
72};
73
74}  // namespace content
75
76#endif  // CONTENT_RENDERER_IMAGE_LOADING_HELPER_H_
77
78