diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-28 07:26:18 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-28 07:26:18 +0000 |
commit | b8fc6e6054b894d3218b958fa46f4ec2af163b56 (patch) | |
tree | 77647e3db08a8e4232ed3f549ff066fff4c81650 /content | |
parent | e62fd8485cf12fc3fd0f47d08e12e876db8f4c4b (diff) | |
download | chromium_src-b8fc6e6054b894d3218b958fa46f4ec2af163b56.zip chromium_src-b8fc6e6054b894d3218b958fa46f4ec2af163b56.tar.gz chromium_src-b8fc6e6054b894d3218b958fa46f4ec2af163b56.tar.bz2 |
aura: Fix taking screenshot of pages in high dpi.
BUG=none
R=piman@chromium.org
Review URL: https://codereview.chromium.org/20858003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214078 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_aura.cc | 4 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_browsertest.cc | 124 |
2 files changed, 126 insertions, 2 deletions
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index ba4e9b1c..9f43ca6 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -1185,7 +1185,9 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurface( &RenderWidgetHostViewAura::CopyFromCompositingSurfaceHasResult, dst_size_in_pixel, callback)); - request->set_area(src_subrect); + gfx::Rect src_subrect_in_pixel = + ConvertRectToPixel(current_device_scale_factor_, src_subrect); + request->set_area(src_subrect_in_pixel); window_->layer()->RequestCopyOfOutput(request.Pass()); } diff --git a/content/browser/renderer_host/render_widget_host_view_browsertest.cc b/content/browser/renderer_host/render_widget_host_view_browsertest.cc index 9d14282..a5ccea7 100644 --- a/content/browser/renderer_host/render_widget_host_view_browsertest.cc +++ b/content/browser/renderer_host/render_widget_host_view_browsertest.cc @@ -7,6 +7,7 @@ #include "base/path_service.h" #include "base/run_loop.h" #include "content/browser/gpu/gpu_data_manager_impl.h" +#include "content/browser/renderer_host/dip_util.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/port/browser/render_widget_host_view_frame_subscriber.h" #include "content/port/browser/render_widget_host_view_port.h" @@ -25,17 +26,23 @@ #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkDevice.h" +#include "ui/base/ui_base_switches.h" #include "ui/compositor/compositor_setup.h" +#include "ui/gfx/size_conversions.h" #include "ui/gl/gl_switches.h" #if defined(OS_MACOSX) #include "ui/gl/io_surface_support_mac.h" #endif +#if defined(OS_WIN) +#include "ui/base/win/dpi.h" +#endif + namespace content { namespace { -// Convenience macro: Short-cicuit a pass for the tests where platform support +// Convenience macro: Short-circuit a pass for the tests where platform support // for forced-compositing mode (or disabled-compositing mode) is lacking. #define SET_UP_SURFACE_OR_PASS_TEST(wait_message) \ if (!SetUpSourceSurface(wait_message)) { \ @@ -45,6 +52,16 @@ namespace { return; \ } +// Convenience macro: Short-circuit a pass for platforms where setting up +// high-DPI fails. +#define PASS_TEST_IF_SCALE_FACTOR_NOT_SUPPORTED(factor) \ + if (ui::GetScaleFactorScale( \ + GetScaleFactorForView(GetRenderWidgetHostViewPort())) != factor) { \ + LOG(WARNING) << "Blindly passing this test: failed to set up " \ + "scale factor: " << factor; \ + return; \ + } + // Common base class for browser tests. This is subclassed twice: Once to test // the browser in forced-compositing mode, and once to test with compositing // mode disabled. @@ -1067,6 +1084,111 @@ IN_PROC_BROWSER_TEST_F(CompositingRenderWidgetHostViewBrowserTestTabCapture, run_loop.Run(); } +class CompositingRenderWidgetHostViewTabCaptureHighDPI + : public CompositingRenderWidgetHostViewBrowserTestTabCapture { + public: + CompositingRenderWidgetHostViewTabCaptureHighDPI() + : kScale(2.f) { + } + + virtual void SetUpCommandLine(CommandLine* cmd) OVERRIDE { + CompositingRenderWidgetHostViewBrowserTestTabCapture::SetUpCommandLine(cmd); + cmd->AppendSwitchASCII(switches::kForceDeviceScaleFactor, + base::StringPrintf("%f", scale())); +#if defined(OS_WIN) + cmd->AppendSwitchASCII(switches::kHighDPISupport, "1"); + ui::EnableHighDPISupport(); +#endif + } + + float scale() const { return kScale; } + + private: + const float kScale; + + DISALLOW_COPY_AND_ASSIGN(CompositingRenderWidgetHostViewTabCaptureHighDPI); +}; + +// High-DPI doesn't work right with content-shell on linux-aura. +// http://crbug.com/265028 +#if defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS) +#define MAYBE_CopyFromCompositingSurface DISABLED_CopyFromCompositingSurface +#else +#define MAYBE_CopyFromCompositingSurface CopyFromCompositingSurface +#endif +IN_PROC_BROWSER_TEST_F(CompositingRenderWidgetHostViewTabCaptureHighDPI, + MAYBE_CopyFromCompositingSurface) { + SetTestUrl("data:text/html,<!doctype html>" + "<div class='left'>" + " <div class='right'></div>" + "</div>" + "<style>" + "body { padding: 0; margin: 0; }" + ".left { position: absolute;" + " background: #0ff;" + " width: 100px;" + " height: 150px;" + "}" + ".right { position: absolute;" + " left: 100px;" + " background: #ff0;" + " width: 100px;" + " height: 150px;" + "}" + "</style>" + "<script>" + " domAutomationController.setAutomationId(0);" + " domAutomationController.send(\"DONE\");" + "</script>"); + SET_UP_SURFACE_OR_PASS_TEST("\"DONE\""); + PASS_TEST_IF_SCALE_FACTOR_NOT_SUPPORTED(scale()); + + RenderViewHost* const rwh = + shell()->web_contents()->GetRenderViewHost(); + RenderWidgetHostViewPort* rwhvp = + static_cast<RenderWidgetHostViewPort*>(rwh->GetView()); + + // The page is loaded in the renderer, wait for a new frame to arrive. + uint32 frame = rwhvp->RendererFrameNumber(); + RenderWidgetHostImpl::From(rwh)->ScheduleComposite(); + while (rwhvp->RendererFrameNumber() == frame) + GiveItSomeTime(); + + gfx::Rect bounds = gfx::Rect(200, 150); + gfx::Size out_size = bounds.size(); + gfx::Size out_size_pixels = gfx::ToFlooredSize(gfx::ScaleSize(out_size, + scale(), + scale())); + + SkBitmap expected_bitmap; + expected_bitmap.setConfig(SkBitmap::kARGB_8888_Config, + out_size_pixels.width(), + out_size_pixels.height()); + expected_bitmap.allocPixels(); + // Left half is #0ff. + expected_bitmap.eraseARGB(255, 0, 255, 255); + // Right half is #ff0. + { + SkAutoLockPixels lock(expected_bitmap); + for (int i = 0; i < out_size_pixels.width() / 2; ++i) { + for (int j = 0; j < out_size_pixels.height(); ++j) { + *expected_bitmap.getAddr32(out_size_pixels.width() / 2 + i, j) = + SkColorSetARGB(255, 255, 255, 0); + } + } + } + SetExpectedCopyFromCompositingSurfaceResult(true, expected_bitmap); + + base::RunLoop run_loop; + base::Callback<void(bool, const SkBitmap&)> callback = + base::Bind(&CompositingRenderWidgetHostViewBrowserTestTabCapture:: + CopyFromCompositingSurfaceCallback, + base::Unretained(this), + run_loop.QuitClosure()); + rwhvp->CopyFromCompositingSurface(bounds, out_size, callback); + run_loop.Run(); +} + #endif // !defined(OS_ANDROID) && !defined(OS_IOS) } // namespace |