• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 class Profile;
19 
20 namespace ash {
21 namespace test {
22 class ScreenshotTakerTest;
23 }
24 }
25 namespace aura {
26 class Window;
27 }
28 
29 class 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:
~ScreenshotTakerObserver()49   virtual ~ScreenshotTakerObserver() {}
50 };
51 
52 class 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 #if defined(OS_CHROMEOS)
96   Notification* CreateNotification(
97       ScreenshotTakerObserver::Result screenshot_result,
98       const base::FilePath& screenshot_path);
99 #endif
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   base::WeakPtrFactory<ScreenshotTaker> factory_;
111 
112   DISALLOW_COPY_AND_ASSIGN(ScreenshotTaker);
113 };
114 
115 #endif  // CHROME_BROWSER_UI_ASH_SCREENSHOT_TAKER_H_
116