Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/renderer/test_runner/WebTestProxy.h" | 5 #include "content/shell/renderer/test_runner/WebTestProxy.h" |
| 6 | 6 |
| 7 #include <cctype> | 7 #include <cctype> |
| 8 | 8 |
| 9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 477 | 477 |
| 478 void WebTestProxyBase::didCompositeAndReadback(const SkBitmap& bitmap) { | 478 void WebTestProxyBase::didCompositeAndReadback(const SkBitmap& bitmap) { |
| 479 TRACE_EVENT2("shell", | 479 TRACE_EVENT2("shell", |
| 480 "WebTestProxyBase::didCompositeAndReadback", | 480 "WebTestProxyBase::didCompositeAndReadback", |
| 481 "x", | 481 "x", |
| 482 bitmap.info().fWidth, | 482 bitmap.info().fWidth, |
| 483 "y", | 483 "y", |
| 484 bitmap.info().fHeight); | 484 bitmap.info().fHeight); |
| 485 SkCanvas canvas(bitmap); | 485 SkCanvas canvas(bitmap); |
| 486 DrawSelectionRect(&canvas); | 486 DrawSelectionRect(&canvas); |
| 487 base::ResetAndReturn(&m_compositeAndReadbackCallback).Run(bitmap); | 487 m_compositeAndReadbackCallbacks.front().Run(bitmap); |
| 488 m_compositeAndReadbackCallbacks.pop_front(); | |
| 488 } | 489 } |
| 489 | 490 |
| 490 void WebTestProxyBase::CapturePixelsAsync( | 491 void WebTestProxyBase::CapturePixelsAsync( |
| 491 base::Callback<void(const SkBitmap&)> callback) { | 492 base::Callback<void(const SkBitmap&)> callback) { |
| 492 m_compositeAndReadbackCallback = callback; | |
| 493 TRACE_EVENT0("shell", "WebTestProxyBase::CapturePixelsAsync"); | 493 TRACE_EVENT0("shell", "WebTestProxyBase::CapturePixelsAsync"); |
| 494 | 494 |
| 495 m_compositeAndReadbackCallbacks.push_back(callback); | |
| 496 | |
| 495 // Do a layout here because it might leave compositing mode! x.x | 497 // Do a layout here because it might leave compositing mode! x.x |
| 496 // TODO(danakj): Remove this when we have kForceCompositingMode everywhere. | 498 // TODO(danakj): Remove this when we have kForceCompositingMode everywhere. |
| 497 webWidget()->layout(); | 499 webWidget()->layout(); |
| 498 | 500 |
| 499 if (!webWidget()->compositeAndReadbackAsync(this)) { | 501 if (!webWidget()->isAcceleratedCompositingActive()) { |
| 500 TRACE_EVENT0("shell", | 502 TRACE_EVENT0("shell", |
| 501 "WebTestProxyBase::CapturePixelsAsync " | 503 "WebTestProxyBase::CapturePixelsAsync " |
| 502 "compositeAndReadbackAsync failed"); | 504 "isAcceleratedCompositingActive false"); |
| 503 didCompositeAndReadback(SkBitmap()); | 505 didCompositeAndReadback(SkBitmap()); |
| 506 return; | |
| 504 } | 507 } |
| 508 | |
| 509 webWidget()->compositeAndReadbackAsync(this); | |
| 505 } | 510 } |
| 506 | 511 |
| 507 void WebTestProxyBase::setLogConsoleOutput(bool enabled) | 512 void WebTestProxyBase::setLogConsoleOutput(bool enabled) |
| 508 { | 513 { |
| 509 m_logConsoleOutput = enabled; | 514 m_logConsoleOutput = enabled; |
| 510 } | 515 } |
| 511 | 516 |
| 512 void WebTestProxyBase::paintRect(const WebRect& rect) | 517 void WebTestProxyBase::paintRect(const WebRect& rect) |
| 513 { | 518 { |
| 514 DCHECK(!m_isPainting); | 519 DCHECK(!m_isPainting); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 590 float deviceScaleFactor = webView()->deviceScaleFactor(); | 595 float deviceScaleFactor = webView()->deviceScaleFactor(); |
| 591 int scaledWidth = static_cast<int>(ceil(static_cast<float>(widgetSize.width) * deviceScaleFactor)); | 596 int scaledWidth = static_cast<int>(ceil(static_cast<float>(widgetSize.width) * deviceScaleFactor)); |
| 592 int scaledHeight = static_cast<int>(ceil(static_cast<float>(widgetSize.heigh t) * deviceScaleFactor)); | 597 int scaledHeight = static_cast<int>(ceil(static_cast<float>(widgetSize.heigh t) * deviceScaleFactor)); |
| 593 // We're allocating the canvas to be non-opaque (third parameter), so we | 598 // We're allocating the canvas to be non-opaque (third parameter), so we |
| 594 // don't end up with uninitialized memory if a layout test doesn't damage | 599 // don't end up with uninitialized memory if a layout test doesn't damage |
| 595 // the entire view. | 600 // the entire view. |
| 596 m_canvas.reset(skia::CreateBitmapCanvas(scaledWidth, scaledHeight, false)); | 601 m_canvas.reset(skia::CreateBitmapCanvas(scaledWidth, scaledHeight, false)); |
| 597 return m_canvas.get(); | 602 return m_canvas.get(); |
| 598 } | 603 } |
| 599 | 604 |
| 600 void WebTestProxyBase::display(base::Closure callback) | 605 void WebTestProxyBase::DisplayForSoftwareMode(const base::Closure& callback) { |
| 601 { | |
| 602 const blink::WebSize& size = webWidget()->size(); | 606 const blink::WebSize& size = webWidget()->size(); |
| 603 WebRect rect(0, 0, size.width, size.height); | 607 WebRect rect(0, 0, size.width, size.height); |
| 604 m_paintRect = rect; | 608 m_paintRect = rect; |
| 605 paintInvalidatedRegion(); | 609 paintInvalidatedRegion(); |
| 606 | 610 |
| 607 if (!callback.is_null()) | 611 if (!callback.is_null()) |
| 608 callback.Run(); | 612 callback.Run(); |
| 609 } | 613 } |
| 610 | 614 |
| 615 void WebTestProxyBase::DidDisplayAsync(const base::Closure& callback, | |
| 616 const SkBitmap& bitmap) { | |
| 617 if (!callback.is_null()) | |
| 618 callback.Run(); | |
| 619 } | |
| 620 | |
| 611 void WebTestProxyBase::displayAsyncThen(base::Closure callback) | 621 void WebTestProxyBase::displayAsyncThen(base::Closure callback) |
| 612 { | 622 { |
| 613 // TODO(enne): When compositing, this should invoke a real rAF, paint, | 623 TRACE_EVENT0("shell", "WebTestProxyBase::displayAsyncThen"); |
| 614 // and commit. For now, just make sure that displayAsync is actually | 624 |
| 615 // async so that callers can't depend on synchronous behavior. | 625 // TODO(danakj): Just call CapturePixelsAsyc when we have |
| 616 m_delegate->postTask(new ClosureTask( | 626 // kForceCompositingMode everywhere. |
| 617 this, | 627 |
| 618 base::Bind( | 628 // Do a layout here because it might leave compositing mode! x.x |
| 619 &WebTestProxyBase::display, base::Unretained(this), callback))); | 629 webWidget()->layout(); |
|
abarth-chromium
2014/05/05 22:37:43
Will this change what we're testing by introducing
danakj
2014/05/05 22:46:55
This does add one additional layout.
| |
| 630 | |
| 631 if (!webWidget()->isAcceleratedCompositingActive()) { | |
| 632 TRACE_EVENT0("shell", | |
| 633 "WebTestProxyBase::displayAsyncThen " | |
| 634 "isAcceleratedCompositingActive false"); | |
| 635 m_delegate->postTask( | |
| 636 new ClosureTask(this, | |
| 637 base::Bind(&WebTestProxyBase::DisplayForSoftwareMode, | |
| 638 base::Unretained(this), | |
| 639 callback))); | |
| 640 return; | |
| 641 } | |
| 642 | |
| 643 m_compositeAndReadbackCallbacks.push_back(base::Bind( | |
| 644 &WebTestProxyBase::DidDisplayAsync, base::Unretained(this), callback)); | |
| 645 webWidget()->compositeAndReadbackAsync(this); | |
| 620 } | 646 } |
| 621 | 647 |
| 622 void WebTestProxyBase::discardBackingStore() | 648 void WebTestProxyBase::discardBackingStore() |
| 623 { | 649 { |
| 624 m_canvas.reset(); | 650 m_canvas.reset(); |
| 625 } | 651 } |
| 626 | 652 |
| 627 WebMIDIClientMock* WebTestProxyBase::midiClientMock() | 653 WebMIDIClientMock* WebTestProxyBase::midiClientMock() |
| 628 { | 654 { |
| 629 if (!m_midiClient.get()) | 655 if (!m_midiClient.get()) |
| (...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1296 | 1322 |
| 1297 void WebTestProxyBase::resetInputMethod() | 1323 void WebTestProxyBase::resetInputMethod() |
| 1298 { | 1324 { |
| 1299 // If a composition text exists, then we need to let the browser process | 1325 // If a composition text exists, then we need to let the browser process |
| 1300 // to cancel the input method's ongoing composition session. | 1326 // to cancel the input method's ongoing composition session. |
| 1301 if (m_webWidget) | 1327 if (m_webWidget) |
| 1302 m_webWidget->confirmComposition(); | 1328 m_webWidget->confirmComposition(); |
| 1303 } | 1329 } |
| 1304 | 1330 |
| 1305 } // namespace content | 1331 } // namespace content |
| OLD | NEW |