15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_ASH_SCREENSHOT_TAKER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_ASH_SCREENSHOT_TAKER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screenshot_delegate.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/observer_list.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/notifications/notification.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Profile; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ash { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace test { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ScreenshotTakerTest; 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Window; 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ScreenshotTakerObserver { 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum Result { 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCREENSHOT_SUCCESS = 0, 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCREENSHOT_GRABWINDOW_PARTIAL_FAILED, 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCREENSHOT_GRABWINDOW_FULL_FAILED, 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCREENSHOT_CREATE_DIR_FAILED, 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCREENSHOT_GET_DIR_FAILED, 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCREENSHOT_CHECK_DIR_FAILED, 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCREENSHOT_CREATE_FILE_FAILED, 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCREENSHOT_WRITE_FILE_FAILED, 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SCREENSHOTS_DISABLED, 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCREENSHOT_RESULT_COUNT 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnScreenshotCompleted( 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Result screenshot_result, 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& screenshot_path) = 0; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~ScreenshotTakerObserver() {} 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScreenshotTaker : public ash::ScreenshotDelegate { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenshotTaker(); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ScreenshotTaker(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ash::ScreenshotDelegate: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleTakeScreenshotForAllRootWindows() OVERRIDE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleTakePartialScreenshot(aura::Window* window, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect) OVERRIDE; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CanTakeScreenshot() OVERRIDE; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ShowNotification( 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScreenshotTakerObserver::Result screenshot_result, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& screenshot_path); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void AddObserver(ScreenshotTakerObserver* observer); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RemoveObserver(ScreenshotTakerObserver* observer); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool HasObserver(ScreenshotTakerObserver* observer) const; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) friend class ash::test::ScreenshotTakerTest; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void GrabWindowSnapshotAsyncCallback( 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath screenshot_path, 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_partial, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int window_idx, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> png_data); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void GrabPartialWindowSnapshotAsync(aura::Window* window, 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& snapshot_bounds, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile, 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath screenshot_path); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void GrabFullWindowSnapshotAsync(aura::Window* window, 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& snapshot_bounds, 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile, 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath screenshot_path, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int window_idx); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* GetProfile(); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetScreenshotDirectoryForTest(const base::FilePath& directory); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetScreenshotBasenameForTest(const std::string& basename); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetScreenshotProfileForTest(Profile* profile); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_CHROMEOS) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Notification* CreateNotification( 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScreenshotTakerObserver::Result screenshot_result, 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& screenshot_path); 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The timestamp when the screenshot task was issued last time. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_screenshot_timestamp_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ObserverList<ScreenshotTakerObserver> observers_; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath screenshot_directory_for_test_; 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string screenshot_basename_for_test_; 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile_for_test_; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WeakPtrFactory<ScreenshotTaker> factory_; 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScreenshotTaker); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_ASH_SCREENSHOT_TAKER_H_ 116