summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-28 07:26:18 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-28 07:26:18 +0000
commitb8fc6e6054b894d3218b958fa46f4ec2af163b56 (patch)
tree77647e3db08a8e4232ed3f549ff066fff4c81650 /content
parente62fd8485cf12fc3fd0f47d08e12e876db8f4c4b (diff)
downloadchromium_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.cc4
-rw-r--r--content/browser/renderer_host/render_widget_host_view_browsertest.cc124
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