Home | History | Annotate | Download | only in webui
      1 // Copyright (c) 2011 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 CHROME_BROWSER_UI_WEBUI_SCREENSHOT_SOURCE_H_
      6 #define CHROME_BROWSER_UI_WEBUI_SCREENSHOT_SOURCE_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/compiler_specific.h"
     14 #include "base/memory/linked_ptr.h"
     15 #include "content/public/browser/url_data_source.h"
     16 
     17 #if defined(OS_CHROMEOS)
     18 #include "chrome/browser/chromeos/drive/file_system_interface.h"
     19 #include "chrome/browser/chromeos/login/user_manager.h"
     20 #include "chrome/browser/google_apis/gdata_errorcode.h"
     21 #endif
     22 
     23 typedef std::vector<unsigned char> ScreenshotData;
     24 typedef linked_ptr<ScreenshotData> ScreenshotDataPtr;
     25 
     26 class Profile;
     27 
     28 namespace base {
     29 class FilePath;
     30 }
     31 
     32 // ScreenshotSource is the data source that serves screenshots (saved
     33 // or current) to the bug report html ui.
     34 class ScreenshotSource : public content::URLDataSource {
     35  public:
     36   explicit ScreenshotSource(
     37       std::vector<unsigned char>* current_screenshot,
     38       Profile* profile);
     39 
     40 #if defined(USE_ASH)
     41   // Queries the browser process to determine if screenshots are disabled.
     42   static bool AreScreenshotsDisabled();
     43 
     44   // Common access for the screenshot directory, parameter is set to the
     45   // requested directory and return value of true is given upon success.
     46   static bool GetScreenshotDirectory(base::FilePath* directory);
     47 #endif
     48 
     49   // Get the basefilename for screenshots
     50   static std::string GetScreenshotBaseFilename();
     51 
     52   // content::URLDataSource implementation.
     53   virtual std::string GetSource() const OVERRIDE;
     54   virtual void StartDataRequest(
     55       const std::string& path,
     56       int render_process_id,
     57       int render_view_id,
     58       const content::URLDataSource::GotDataCallback& callback) OVERRIDE;
     59   virtual std::string GetMimeType(const std::string&) const OVERRIDE;
     60 
     61   // Get the screenshot specified by the given relative path that we've cached
     62   // from a previous request to the screenshots source.
     63   // Note: This method strips the query string from the given path.
     64   ScreenshotDataPtr GetCachedScreenshot(const std::string& screenshot_path);
     65 
     66   // Url that represents the base directory for screenshots.
     67   static const char kScreenshotUrlRoot[];
     68   // Identifier for the current screenshot
     69   // (relative to screenshot base directory).
     70   static const char kScreenshotCurrent[];
     71   // Path for directory where screenshots are saved
     72   // (relative to screenshot base directory).
     73   static const char kScreenshotSaved[];
     74 #if defined(OS_CHROMEOS)
     75   // Common prefix to screenshot filenames.
     76   static const char kScreenshotPrefix[];
     77   // Common suffix to screenshot filenames.
     78   static const char kScreenshotSuffix[];
     79 #endif
     80 
     81  private:
     82   virtual ~ScreenshotSource();
     83 
     84   // Send the screenshot specified by the given relative path to the requestor.
     85   // This is the ancestor for SendSavedScreenshot and CacheAndSendScreenshot.
     86   // All calls to send a screenshot should only call this method.
     87   // Note: This method strips the query string from the given path.
     88   void SendScreenshot(const std::string& screenshot_path,
     89                       const content::URLDataSource::GotDataCallback& callback);
     90 #if defined(OS_CHROMEOS)
     91   // Send a saved screenshot image file specified by the given screenshot path
     92   // to the requestor.
     93   void SendSavedScreenshot(
     94       const std::string& screenshot_path,
     95       const content::URLDataSource::GotDataCallback& callback,
     96       const base::FilePath& file);
     97 
     98   // The callback for Drive's getting file method.
     99   void GetSavedScreenshotCallback(
    100       const std::string& screenshot_path,
    101       const content::URLDataSource::GotDataCallback& callback,
    102       drive::FileError error,
    103       const base::FilePath& file,
    104       scoped_ptr<drive::ResourceEntry> entry);
    105 
    106 #endif
    107   // Sends the screenshot data to the requestor while caching it locally to the
    108   // class instance, indexed by path.
    109   void CacheAndSendScreenshot(
    110       const std::string& screenshot_path,
    111       const content::URLDataSource::GotDataCallback& callback,
    112       ScreenshotDataPtr bytes);
    113 
    114   // Pointer to the screenshot data for the current screenshot.
    115   ScreenshotDataPtr current_screenshot_;
    116 
    117   Profile* profile_;
    118 
    119   // Key: Relative path to the screenshot (including filename)
    120   // Value: Pointer to the screenshot data associated with the path.
    121   std::map<std::string, ScreenshotDataPtr> cached_screenshots_;
    122 
    123   DISALLOW_COPY_AND_ASSIGN(ScreenshotSource);
    124 };
    125 
    126 #endif  // CHROME_BROWSER_UI_WEBUI_SCREENSHOT_SOURCE_H_
    127