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