screenshot_taker.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright (c) 2012 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_ASH_SCREENSHOT_TAKER_H_
6#define CHROME_BROWSER_UI_ASH_SCREENSHOT_TAKER_H_
7
8#include "ash/screenshot_delegate.h"
9#include "base/basictypes.h"
10#include "base/compiler_specific.h"
11#include "base/files/file_path.h"
12#include "base/memory/scoped_ptr.h"
13#include "base/memory/weak_ptr.h"
14#include "base/observer_list.h"
15#include "base/time/time.h"
16#include "chrome/browser/notifications/notification.h"
17
18class Profile;
19
20namespace ash {
21namespace test {
22class ScreenshotTakerTest;
23}
24}
25namespace aura {
26class Window;
27}
28
29class ScreenshotTakerObserver {
30 public:
31  enum Result {
32    SCREENSHOT_SUCCESS = 0,
33    SCREENSHOT_GRABWINDOW_PARTIAL_FAILED,
34    SCREENSHOT_GRABWINDOW_FULL_FAILED,
35    SCREENSHOT_CREATE_DIR_FAILED,
36    SCREENSHOT_GET_DIR_FAILED,
37    SCREENSHOT_CHECK_DIR_FAILED,
38    SCREENSHOT_CREATE_FILE_FAILED,
39    SCREENSHOT_WRITE_FILE_FAILED,
40    SCREENSHOTS_DISABLED,
41    SCREENSHOT_RESULT_COUNT
42  };
43
44  virtual void OnScreenshotCompleted(
45      Result screenshot_result,
46      const base::FilePath& screenshot_path) = 0;
47
48 protected:
49  virtual ~ScreenshotTakerObserver() {}
50};
51
52class ScreenshotTaker : public ash::ScreenshotDelegate {
53 public:
54  ScreenshotTaker();
55
56  virtual ~ScreenshotTaker();
57
58  // Overridden from ash::ScreenshotDelegate:
59  virtual void HandleTakeScreenshotForAllRootWindows() OVERRIDE;
60  virtual void HandleTakePartialScreenshot(aura::Window* window,
61                                           const gfx::Rect& rect) OVERRIDE;
62  virtual bool CanTakeScreenshot() OVERRIDE;
63
64  void ShowNotification(
65      ScreenshotTakerObserver::Result screenshot_result,
66      const base::FilePath& screenshot_path);
67
68  void AddObserver(ScreenshotTakerObserver* observer);
69  void RemoveObserver(ScreenshotTakerObserver* observer);
70  bool HasObserver(ScreenshotTakerObserver* observer) const;
71
72 private:
73  friend class ash::test::ScreenshotTakerTest;
74
75  void GrabWindowSnapshotAsyncCallback(
76      base::FilePath screenshot_path,
77      bool is_partial,
78      int window_idx,
79      scoped_refptr<base::RefCountedBytes> png_data);
80  void GrabPartialWindowSnapshotAsync(aura::Window* window,
81                                      const gfx::Rect& snapshot_bounds,
82                                      Profile* profile,
83                                      base::FilePath screenshot_path);
84  void GrabFullWindowSnapshotAsync(aura::Window* window,
85                                   const gfx::Rect& snapshot_bounds,
86                                   Profile* profile,
87                                   base::FilePath screenshot_path,
88                                   int window_idx);
89
90  Profile* GetProfile();
91  void SetScreenshotDirectoryForTest(const base::FilePath& directory);
92  void SetScreenshotBasenameForTest(const std::string& basename);
93  void SetScreenshotProfileForTest(Profile* profile);
94
95  Notification* CreateNotification(
96      ScreenshotTakerObserver::Result screenshot_result,
97      const base::FilePath& screenshot_path);
98
99  base::WeakPtrFactory<ScreenshotTaker> factory_;
100
101  // The timestamp when the screenshot task was issued last time.
102  base::Time last_screenshot_timestamp_;
103
104  ObserverList<ScreenshotTakerObserver> observers_;
105
106  base::FilePath screenshot_directory_for_test_;
107  std::string screenshot_basename_for_test_;
108  Profile* profile_for_test_;
109
110  DISALLOW_COPY_AND_ASSIGN(ScreenshotTaker);
111};
112
113#endif  // CHROME_BROWSER_UI_ASH_SCREENSHOT_TAKER_H_
114