15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_WEBUI_FILEICON_SOURCE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_WEBUI_FILEICON_SOURCE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task/cancelable_task_tracker.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/icon_manager.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/url_data_source.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Image;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FileIconSource is the gateway between network-level chrome:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requests for favicons and the history backend that serves these.
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FileIconSource : public content::URLDataSource {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit FileIconSource();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // content::URLDataSource implementation.
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual std::string GetSource() const OVERRIDE;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartDataRequest(
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& path,
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      int render_process_id,
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      int render_frame_id,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const content::URLDataSource::GotDataCallback& callback) OVERRIDE;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetMimeType(const std::string&) const OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FileIconSource();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once the |path| and |icon_size| has been determined from the request, this
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // function is called to perform the actual fetch. Declared as virtual for
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // testing.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FetchFileIcon(
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      float scale_factor,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IconLoader::IconSize icon_size,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const content::URLDataSource::GotDataCallback& callback);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains the necessary information for completing an icon fetch request.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct IconRequestDetails {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IconRequestDetails();
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~IconRequestDetails();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The callback to run with the response.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::URLDataSource::GotDataCallback callback;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The requested scale factor to respond with.
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    float scale_factor;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when favicon data is available from the history backend.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFileIconDataAvailable(const IconRequestDetails& details,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               gfx::Image* icon);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tracks tasks requesting file icons.
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker cancelable_task_tracker_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FileIconSource);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_WEBUI_FILEICON_SOURCE_H_
69