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#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