Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 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 #include "chrome/browser/chromeos/login/screenshot_tester.h" | |
| 6 | |
| 7 #include "ash/shell.h" | |
| 8 #include "base/base_export.h" | |
| 9 #include "base/bind_internal.h" | |
| 10 #include "base/memory/weak_ptr.h" | |
| 11 #include "base/prefs/pref_service.h" | |
| 12 #include "base/run_loop.h" | |
| 13 #include "chrome/browser/browser_process.h" | |
| 14 #include "chrome/browser/chromeos/login/login_manager_test.h" | |
| 15 #include "chrome/browser/chromeos/login/startup_utils.h" | |
| 16 #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h" | |
| 17 #include "chrome/browser/ui/ash/screenshot_taker.h" | |
| 18 #include "chrome/common/pref_names.h" | |
| 19 #include "content/public/browser/browser_thread.h" | |
| 20 #include "content/public/browser/notification_observer.h" | |
| 21 #include "content/public/browser/notification_registrar.h" | |
| 22 #include "ui/compositor/compositor_switches.h" | |
| 23 #include "ui/gfx/image/image.h" | |
| 24 #include "ui/snapshot/snapshot.h" | |
| 25 | |
| 26 ScreenshotTester::ScreenshotTester() : weak_factory_(this) { | |
| 27 } | |
| 28 | |
| 29 ScreenshotTester::~ScreenshotTester() { | |
| 30 } | |
| 31 | |
| 32 bool ScreenshotTester::TryInitialize() { | |
| 33 CommandLine& command_line = *CommandLine::ForCurrentProcess(); | |
| 34 if (!command_line.HasSwitch(kEnableTestScreenshots)) { | |
|
ygorshenin1
2014/07/21 09:48:22
nit: curly braces are not needed here.
Lisa Ignatyeva
2014/07/21 13:41:03
Done.
| |
| 35 return false; | |
| 36 } | |
| 37 bool screenshot_dest_enabled_ = command_line.HasSwitch(kScreenshotDest); | |
|
ygorshenin1
2014/07/21 09:48:22
Local variables must be declared without underscor
Lisa Ignatyeva
2014/07/21 13:41:03
Done.
| |
| 38 if (!command_line.HasSwitch(switches::kEnablePixelOutputInTests) || | |
| 39 !command_line.HasSwitch(switches::kUIEnableImplSidePainting)) { | |
| 40 // TODO(elizavetai): make turning on --enable-pixel-output-in-tests | |
| 41 // and --ui-enalbe-impl-side-painting automatical. | |
| 42 LOG(ERROR) << "--enable-pixel-output-in-tests and " | |
| 43 << "--ui-enable-impl-side-painting are required to take " | |
| 44 << "screenshots. Screenshots will not be taken"; | |
| 45 return false; | |
| 46 } | |
| 47 if (screenshot_dest_enabled_) { | |
|
ygorshenin1
2014/07/21 09:48:22
As you're always use both flags: "--enable-test-sc
Denis Kuznetsov (DE-MUC)
2014/07/21 12:13:16
Later there will be a stage when we compare screen
Lisa Ignatyeva
2014/07/21 13:41:03
Done.
Lisa Ignatyeva
2014/07/21 13:41:03
Done.
| |
| 48 screenshot_dest_ = command_line.GetSwitchValuePath(kScreenshotDest); | |
| 49 } else { | |
| 50 LOG(ERROR) | |
| 51 << "Using --enable-test-screenshots without setting " | |
| 52 "screenshot destination" | |
| 53 << " via --screenshot-dest=YOUR_PATH is not supported. Screenshots" | |
| 54 << " will not be taken"; | |
| 55 return false; | |
| 56 } | |
| 57 update_golden_screenshot_ = command_line.HasSwitch(kUpdateGoldenScreenshots); | |
| 58 return true; | |
| 59 } | |
| 60 | |
| 61 void ScreenshotTester::Run(const std::string& file_name) { | |
| 62 TakeScreenshot(); | |
| 63 PNGFile current_screenshot = screenshot; | |
| 64 golden_screenshot_path = screenshot_dest_.AppendASCII(file_name + ".png"); | |
| 65 if (update_golden_screenshot_) { | |
| 66 UpdateGoldenScreenshot(current_screenshot); | |
| 67 } else { | |
| 68 // TODO(elizavetai): implement loading screenshots and comparing them | |
| 69 LOG(ERROR) | |
| 70 << "Comparing screenshots is not supported yet. Nothing will be done"; | |
| 71 } | |
| 72 } | |
| 73 | |
| 74 void ScreenshotTester::UpdateGoldenScreenshot(PNGFile png_data) { | |
| 75 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 76 if (!png_data) { | |
| 77 LOG(ERROR) << "Can't take a screenshot"; | |
| 78 return; | |
| 79 } | |
| 80 if (!base::CreateDirectory(golden_screenshot_path.DirName())) { | |
| 81 LOG(ERROR) << "Can't create a directory "; | |
| 82 return; | |
| 83 } | |
| 84 if (static_cast<size_t>( | |
| 85 base::WriteFile(golden_screenshot_path, | |
| 86 reinterpret_cast<char*>(&(png_data->data()[0])), | |
| 87 png_data->size())) != png_data->size()) { | |
| 88 LOG(ERROR) << "Can't save screenshot"; | |
| 89 } | |
| 90 VLOG(0) << "Golden screenshot updated successfully"; | |
| 91 } | |
| 92 | |
| 93 void ScreenshotTester::ReturnScreenshot(PNGFile png_data) { | |
| 94 // TODO(elizavetai): rewrite this function so that TakeScreenshot | |
| 95 // could return a |PNGFile| -- current screenshot. | |
| 96 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 97 screenshot = png_data; | |
| 98 content::BrowserThread::PostTask( | |
| 99 content::BrowserThread::UI, FROM_HERE, run_loop_quitter_); | |
| 100 } | |
| 101 | |
| 102 void ScreenshotTester::TakeScreenshot() { | |
| 103 aura::Window* primary_window = ash::Shell::GetPrimaryRootWindow(); | |
| 104 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
|
ygorshenin1
2014/07/21 09:48:23
nit: move DCHECK to the beginning of the method.
Denis Kuznetsov (DE-MUC)
2014/07/21 12:13:16
Acknowledged.
Lisa Ignatyeva
2014/07/21 13:41:03
Done.
Lisa Ignatyeva
2014/07/21 13:41:03
Done.
| |
| 105 gfx::Rect rect = primary_window->bounds(); | |
| 106 PNGFile screenshot; | |
|
ygorshenin1
2014/07/21 09:48:22
This variable is unused.
Lisa Ignatyeva
2014/07/21 13:41:03
Done.
| |
| 107 ui::GrabWindowSnapshotAsync(primary_window, | |
| 108 rect, | |
| 109 content::BrowserThread::GetBlockingPool(), | |
| 110 base::Bind(&ScreenshotTester::ReturnScreenshot, | |
| 111 weak_factory_.GetWeakPtr())); | |
| 112 base::RunLoop run_loop; | |
| 113 run_loop_quitter_ = run_loop.QuitClosure(); | |
| 114 run_loop.Run(); | |
| 115 } | |
| OLD | NEW |