| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/shell/webkit_test_runner.h" | 5 #include "content/shell/webkit_test_runner.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/md5.h" | 10 #include "base/md5.h" |
| (...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 WebFrame::RenderAsTextNormal; | 484 WebFrame::RenderAsTextNormal; |
| 485 if (printing_) | 485 if (printing_) |
| 486 render_text_behavior |= WebFrame::RenderAsTextPrinting; | 486 render_text_behavior |= WebFrame::RenderAsTextPrinting; |
| 487 dump = frame->renderTreeAsText(render_text_behavior).utf8(); | 487 dump = frame->renderTreeAsText(render_text_behavior).utf8(); |
| 488 dump.append(DumpFrameScrollPosition(frame, dump_child_frames_as_text_)); | 488 dump.append(DumpFrameScrollPosition(frame, dump_child_frames_as_text_)); |
| 489 } | 489 } |
| 490 Send(new ShellViewHostMsg_TextDump(routing_id(), dump)); | 490 Send(new ShellViewHostMsg_TextDump(routing_id(), dump)); |
| 491 } | 491 } |
| 492 | 492 |
| 493 void WebKitTestRunner::CaptureImageDump() { | 493 void WebKitTestRunner::CaptureImageDump() { |
| 494 SkBitmap snapshot; | 494 SkBitmap empty_image; |
| 495 PaintInvalidatedRegion(); | |
| 496 CopyCanvasToBitmap(GetCanvas(), &snapshot); | |
| 497 | |
| 498 SkAutoLockPixels snapshot_lock(snapshot); | |
| 499 base::MD5Digest digest; | |
| 500 #if defined(OS_ANDROID) | |
| 501 // On Android, pixel layout is RGBA, however, other Chrome platforms use BGRA. | |
| 502 const uint8_t* raw_pixels = | |
| 503 reinterpret_cast<const uint8_t*>(snapshot.getPixels()); | |
| 504 size_t snapshot_size = snapshot.getSize(); | |
| 505 scoped_array<uint8_t> reordered_pixels(new uint8_t[snapshot_size]); | |
| 506 for (size_t i = 0; i < snapshot_size; i += 4) { | |
| 507 reordered_pixels[i] = raw_pixels[i + 2]; | |
| 508 reordered_pixels[i + 1] = raw_pixels[i + 1]; | |
| 509 reordered_pixels[i + 2] = raw_pixels[i]; | |
| 510 reordered_pixels[i + 3] = raw_pixels[i + 3]; | |
| 511 } | |
| 512 base::MD5Sum(reordered_pixels.get(), snapshot_size, &digest); | |
| 513 #else | |
| 514 base::MD5Sum(snapshot.getPixels(), snapshot.getSize(), &digest); | |
| 515 #endif | |
| 516 std::string actual_pixel_hash = base::MD5DigestToBase16(digest); | |
| 517 | |
| 518 if (actual_pixel_hash == expected_pixel_hash_) { | |
| 519 SkBitmap empty_image; | |
| 520 Send(new ShellViewHostMsg_ImageDump( | |
| 521 routing_id(), actual_pixel_hash, empty_image)); | |
| 522 return; | |
| 523 } | |
| 524 Send(new ShellViewHostMsg_ImageDump( | 495 Send(new ShellViewHostMsg_ImageDump( |
| 525 routing_id(), actual_pixel_hash, snapshot)); | 496 routing_id(), expected_pixel_hash_, empty_image)); |
| 526 } | 497 } |
| 527 | 498 |
| 528 void WebKitTestRunner::OnSetTestConfiguration( | 499 void WebKitTestRunner::OnSetTestConfiguration( |
| 529 const base::FilePath& current_working_directory, | 500 const base::FilePath& current_working_directory, |
| 530 bool enable_pixel_dumping, | 501 bool enable_pixel_dumping, |
| 531 int layout_test_timeout, | 502 int layout_test_timeout, |
| 532 bool allow_external_pages, | 503 bool allow_external_pages, |
| 533 const std::string& expected_pixel_hash) { | 504 const std::string& expected_pixel_hash) { |
| 534 current_working_directory_ = current_working_directory; | 505 current_working_directory_ = current_working_directory; |
| 535 enable_pixel_dumping_ = enable_pixel_dumping; | 506 enable_pixel_dumping_ = enable_pixel_dumping; |
| 536 layout_test_timeout_ = layout_test_timeout; | 507 layout_test_timeout_ = layout_test_timeout; |
| 537 allow_external_pages_ = allow_external_pages; | 508 allow_external_pages_ = allow_external_pages; |
| 538 expected_pixel_hash_ = expected_pixel_hash; | 509 expected_pixel_hash_ = expected_pixel_hash; |
| 539 } | 510 } |
| 540 | 511 |
| 541 SkCanvas* WebKitTestRunner::GetCanvas() { | |
| 542 WebView* view = render_view()->GetWebView(); | |
| 543 const WebSize& size = view->size(); | |
| 544 float device_scale_factor = view->deviceScaleFactor(); | |
| 545 int width = std::ceil(device_scale_factor * size.width); | |
| 546 int height = std::ceil(device_scale_factor * size.height); | |
| 547 | |
| 548 if (canvas_ && | |
| 549 canvas_->getDeviceSize().width() == width && | |
| 550 canvas_->getDeviceSize().height() == height) { | |
| 551 return canvas_.get(); | |
| 552 } | |
| 553 canvas_.reset(skia::CreatePlatformCanvas( | |
| 554 size.width, size.height, true, 0, skia::RETURN_NULL_ON_FAILURE)); | |
| 555 return canvas_.get(); | |
| 556 } | |
| 557 | |
| 558 void WebKitTestRunner::PaintRect(const WebRect& rect) { | |
| 559 WebView* view = render_view()->GetWebView(); | |
| 560 float device_scale_factor = view->deviceScaleFactor(); | |
| 561 int scaled_x = device_scale_factor * rect.x; | |
| 562 int scaled_y = device_scale_factor * rect.y; | |
| 563 int scaled_width = std::ceil(device_scale_factor * rect.width); | |
| 564 int scaled_height = std::ceil(device_scale_factor * rect.height); | |
| 565 // TODO(jochen): Verify that the scaling is correct once the HiDPI tests | |
| 566 // actually work. | |
| 567 WebRect device_rect(scaled_x, scaled_y, scaled_width, scaled_height); | |
| 568 view->paint(webkit_glue::ToWebCanvas(GetCanvas()), device_rect); | |
| 569 } | |
| 570 | |
| 571 void WebKitTestRunner::PaintInvalidatedRegion() { | |
| 572 WebView* view = render_view()->GetWebView(); | |
| 573 view->animate(0.0); | |
| 574 view->layout(); | |
| 575 const WebSize& widget_size = view->size(); | |
| 576 WebRect client_rect(0, 0, widget_size.width, widget_size.height); | |
| 577 | |
| 578 // Paint the canvas if necessary. Allow painting to generate extra rects | |
| 579 // for the first two calls. This is necessary because some WebCore rendering | |
| 580 // objects update their layout only when painted. | |
| 581 for (int i = 0; i < 3; ++i) { | |
| 582 // Make sure that paint_rect is always inside the RenderView's visible | |
| 583 // area. | |
| 584 WebRect paint_rect = proxy_->paintRect(); | |
| 585 int left = std::max(paint_rect.x, client_rect.x); | |
| 586 int top = std::max(paint_rect.y, client_rect.y); | |
| 587 int right = std::min(paint_rect.x + paint_rect.width, | |
| 588 client_rect.x + client_rect.width); | |
| 589 int bottom = std::min(paint_rect.y + paint_rect.height, | |
| 590 client_rect.y + client_rect.height); | |
| 591 WebRect rect; | |
| 592 if (left < right && top < bottom) | |
| 593 rect = WebRect(left, top, right - left, bottom - top); | |
| 594 proxy_->setPaintRect(WebRect()); | |
| 595 if (rect.isEmpty()) | |
| 596 continue; | |
| 597 PaintRect(rect); | |
| 598 } | |
| 599 CHECK(proxy_->paintRect().isEmpty()); | |
| 600 } | |
| 601 | |
| 602 void WebKitTestRunner::DisplayRepaintMask() { | |
| 603 GetCanvas()->drawARGB(167, 0, 0, 0); | |
| 604 } | |
| 605 | |
| 606 } // namespace content | 512 } // namespace content |
| OLD | NEW |