Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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/web_test_proxy.h" | 5 #include "content/shell/renderer/test_runner/web_test_proxy.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/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 #include "content/shell/renderer/test_runner/spell_check_client.h" | 27 #include "content/shell/renderer/test_runner/spell_check_client.h" |
| 28 #include "content/shell/renderer/test_runner/test_interfaces.h" | 28 #include "content/shell/renderer/test_runner/test_interfaces.h" |
| 29 #include "content/shell/renderer/test_runner/test_plugin.h" | 29 #include "content/shell/renderer/test_runner/test_plugin.h" |
| 30 #include "content/shell/renderer/test_runner/test_runner.h" | 30 #include "content/shell/renderer/test_runner/test_runner.h" |
| 31 #include "content/shell/renderer/test_runner/web_test_runner.h" | 31 #include "content/shell/renderer/test_runner/web_test_runner.h" |
| 32 // FIXME: Including platform_canvas.h here is a layering violation. | 32 // FIXME: Including platform_canvas.h here is a layering violation. |
| 33 #include "skia/ext/platform_canvas.h" | 33 #include "skia/ext/platform_canvas.h" |
| 34 #include "third_party/WebKit/public/platform/Platform.h" | 34 #include "third_party/WebKit/public/platform/Platform.h" |
| 35 #include "third_party/WebKit/public/platform/WebCString.h" | 35 #include "third_party/WebKit/public/platform/WebCString.h" |
| 36 #include "third_party/WebKit/public/platform/WebClipboard.h" | 36 #include "third_party/WebKit/public/platform/WebClipboard.h" |
| 37 #include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallbac k.h" | |
| 37 #include "third_party/WebKit/public/platform/WebURLError.h" | 38 #include "third_party/WebKit/public/platform/WebURLError.h" |
| 38 #include "third_party/WebKit/public/platform/WebURLRequest.h" | 39 #include "third_party/WebKit/public/platform/WebURLRequest.h" |
| 39 #include "third_party/WebKit/public/platform/WebURLResponse.h" | 40 #include "third_party/WebKit/public/platform/WebURLResponse.h" |
| 40 #include "third_party/WebKit/public/web/WebAXEnums.h" | 41 #include "third_party/WebKit/public/web/WebAXEnums.h" |
| 41 #include "third_party/WebKit/public/web/WebAXObject.h" | 42 #include "third_party/WebKit/public/web/WebAXObject.h" |
| 42 #include "third_party/WebKit/public/web/WebCachedURLRequest.h" | 43 #include "third_party/WebKit/public/web/WebCachedURLRequest.h" |
| 43 #include "third_party/WebKit/public/web/WebConsoleMessage.h" | 44 #include "third_party/WebKit/public/web/WebConsoleMessage.h" |
| 44 #include "third_party/WebKit/public/web/WebDataSource.h" | 45 #include "third_party/WebKit/public/web/WebDataSource.h" |
| 45 #include "third_party/WebKit/public/web/WebDocument.h" | 46 #include "third_party/WebKit/public/web/WebDocument.h" |
| 46 #include "third_party/WebKit/public/web/WebElement.h" | 47 #include "third_party/WebKit/public/web/WebElement.h" |
| 47 #include "third_party/WebKit/public/web/WebHistoryItem.h" | 48 #include "third_party/WebKit/public/web/WebHistoryItem.h" |
| 48 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 49 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 49 #include "third_party/WebKit/public/web/WebMIDIClientMock.h" | 50 #include "third_party/WebKit/public/web/WebMIDIClientMock.h" |
| 50 #include "third_party/WebKit/public/web/WebNode.h" | 51 #include "third_party/WebKit/public/web/WebNode.h" |
| 52 #include "third_party/WebKit/public/web/WebPagePopup.h" | |
| 51 #include "third_party/WebKit/public/web/WebPluginParams.h" | 53 #include "third_party/WebKit/public/web/WebPluginParams.h" |
| 52 #include "third_party/WebKit/public/web/WebPrintParams.h" | 54 #include "third_party/WebKit/public/web/WebPrintParams.h" |
| 53 #include "third_party/WebKit/public/web/WebRange.h" | 55 #include "third_party/WebKit/public/web/WebRange.h" |
| 54 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" | 56 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" |
| 55 #include "third_party/WebKit/public/web/WebView.h" | 57 #include "third_party/WebKit/public/web/WebView.h" |
| 58 #include "third_party/WebKit/public/web/WebWidgetClient.h" | |
| 56 | 59 |
| 57 namespace content { | 60 namespace content { |
| 58 | 61 |
| 59 namespace { | 62 namespace { |
| 60 | 63 |
| 64 class CaptureCallback : public blink::WebCompositeAndReadbackAsyncCallback { | |
| 65 public: | |
| 66 CaptureCallback(const base::Callback<void(const SkBitmap&)>& callback); | |
| 67 virtual ~CaptureCallback(); | |
| 68 | |
| 69 void set_wait_for_popup(bool wait) { wait_for_popup_ = wait; } | |
| 70 void set_popup_position(const gfx::Point& position) { | |
| 71 popup_position_ = position; | |
| 72 } | |
| 73 | |
| 74 // WebCompositeAndReadbackAsyncCallback implementation. | |
| 75 virtual void didCompositeAndReadback(const SkBitmap& bitmap); | |
| 76 | |
| 77 private: | |
| 78 base::Callback<void(const SkBitmap&)> callback_; | |
| 79 SkBitmap main_bitmap_; | |
| 80 bool wait_for_popup_; | |
| 81 gfx::Point popup_position_; | |
| 82 }; | |
| 83 | |
| 61 class HostMethodTask : public WebMethodTask<WebTestProxyBase> { | 84 class HostMethodTask : public WebMethodTask<WebTestProxyBase> { |
| 62 public: | 85 public: |
| 63 typedef void (WebTestProxyBase::*CallbackMethodType)(); | 86 typedef void (WebTestProxyBase::*CallbackMethodType)(); |
| 64 HostMethodTask(WebTestProxyBase* object, CallbackMethodType callback) | 87 HostMethodTask(WebTestProxyBase* object, CallbackMethodType callback) |
| 65 : WebMethodTask<WebTestProxyBase>(object), callback_(callback) {} | 88 : WebMethodTask<WebTestProxyBase>(object), callback_(callback) {} |
| 66 | 89 |
| 67 virtual void RunIfValid() OVERRIDE { (object_->*callback_)(); } | 90 virtual void RunIfValid() OVERRIDE { (object_->*callback_)(); } |
| 68 | 91 |
| 69 private: | 92 private: |
| 70 CallbackMethodType callback_; | 93 CallbackMethodType callback_; |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 324 chooser_count_(0) { | 347 chooser_count_(0) { |
| 325 // TODO(enne): using the scheduler introduces additional composite steps | 348 // TODO(enne): using the scheduler introduces additional composite steps |
| 326 // that create flakiness. This should go away eventually. | 349 // that create flakiness. This should go away eventually. |
| 327 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 350 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 328 switches::kDisableSingleThreadProxyScheduler); | 351 switches::kDisableSingleThreadProxyScheduler); |
| 329 Reset(); | 352 Reset(); |
| 330 } | 353 } |
| 331 | 354 |
| 332 WebTestProxyBase::~WebTestProxyBase() { | 355 WebTestProxyBase::~WebTestProxyBase() { |
| 333 test_interfaces_->WindowClosed(this); | 356 test_interfaces_->WindowClosed(this); |
| 334 // Tests must wait for readback requests to finish before notifying that | |
| 335 // they are done. | |
| 336 CHECK_EQ(0u, composite_and_readback_callbacks_.size()); | |
| 337 } | 357 } |
| 338 | 358 |
| 339 void WebTestProxyBase::SetInterfaces(WebTestInterfaces* interfaces) { | 359 void WebTestProxyBase::SetInterfaces(WebTestInterfaces* interfaces) { |
| 340 test_interfaces_ = interfaces->testInterfaces(); | 360 test_interfaces_ = interfaces->testInterfaces(); |
| 341 test_interfaces_->WindowOpened(this); | 361 test_interfaces_->WindowOpened(this); |
| 342 } | 362 } |
| 343 | 363 |
| 344 void WebTestProxyBase::SetDelegate(WebTestDelegate* delegate) { | 364 void WebTestProxyBase::SetDelegate(WebTestDelegate* delegate) { |
| 345 delegate_ = delegate; | 365 delegate_ = delegate; |
| 346 spellcheck_->SetDelegate(delegate); | 366 spellcheck_->SetDelegate(delegate); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 451 SkPaint paint; | 471 SkPaint paint; |
| 452 paint.setColor(0xFFFF0000); // Fully opaque red | 472 paint.setColor(0xFFFF0000); // Fully opaque red |
| 453 paint.setStyle(SkPaint::kStroke_Style); | 473 paint.setStyle(SkPaint::kStroke_Style); |
| 454 paint.setFlags(SkPaint::kAntiAlias_Flag); | 474 paint.setFlags(SkPaint::kAntiAlias_Flag); |
| 455 paint.setStrokeWidth(1.0f); | 475 paint.setStrokeWidth(1.0f); |
| 456 SkIRect rect; // Bounding rect | 476 SkIRect rect; // Bounding rect |
| 457 rect.set(wr.x, wr.y, wr.x + wr.width, wr.y + wr.height); | 477 rect.set(wr.x, wr.y, wr.x + wr.width, wr.y + wr.height); |
| 458 canvas->drawIRect(rect, paint); | 478 canvas->drawIRect(rect, paint); |
| 459 } | 479 } |
| 460 | 480 |
| 461 void WebTestProxyBase::didCompositeAndReadback(const SkBitmap& bitmap) { | |
| 462 TRACE_EVENT2("shell", | |
| 463 "WebTestProxyBase::didCompositeAndReadback", | |
| 464 "x", | |
| 465 bitmap.info().fWidth, | |
| 466 "y", | |
| 467 bitmap.info().fHeight); | |
| 468 SkCanvas canvas(bitmap); | |
| 469 DrawSelectionRect(&canvas); | |
| 470 DCHECK(!composite_and_readback_callbacks_.empty()); | |
| 471 composite_and_readback_callbacks_.front().Run(bitmap); | |
| 472 composite_and_readback_callbacks_.pop_front(); | |
| 473 } | |
| 474 | |
| 475 void WebTestProxyBase::SetAcceptLanguages(const std::string& accept_languages) { | 481 void WebTestProxyBase::SetAcceptLanguages(const std::string& accept_languages) { |
| 476 bool notify = accept_languages_ != accept_languages; | 482 bool notify = accept_languages_ != accept_languages; |
| 477 accept_languages_ = accept_languages; | 483 accept_languages_ = accept_languages; |
| 478 | 484 |
| 479 if (notify) | 485 if (notify) |
| 480 GetWebView()->acceptLanguagesChanged(); | 486 GetWebView()->acceptLanguagesChanged(); |
| 481 } | 487 } |
| 482 | 488 |
| 483 void WebTestProxyBase::CopyImageAtAndCapturePixels( | 489 void WebTestProxyBase::CopyImageAtAndCapturePixels( |
| 484 int x, int y, const base::Callback<void(const SkBitmap&)>& callback) { | 490 int x, int y, const base::Callback<void(const SkBitmap&)>& callback) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 521 } | 527 } |
| 522 web_frame->printPagesWithBoundaries(canvas.get(), page_size_in_pixels); | 528 web_frame->printPagesWithBoundaries(canvas.get(), page_size_in_pixels); |
| 523 web_frame->printEnd(); | 529 web_frame->printEnd(); |
| 524 | 530 |
| 525 DrawSelectionRect(canvas.get()); | 531 DrawSelectionRect(canvas.get()); |
| 526 SkBaseDevice* device = skia::GetTopDevice(*canvas); | 532 SkBaseDevice* device = skia::GetTopDevice(*canvas); |
| 527 const SkBitmap& bitmap = device->accessBitmap(false); | 533 const SkBitmap& bitmap = device->accessBitmap(false); |
| 528 callback.Run(bitmap); | 534 callback.Run(bitmap); |
| 529 } | 535 } |
| 530 | 536 |
| 537 CaptureCallback::CaptureCallback( | |
| 538 const base::Callback<void(const SkBitmap&)>& callback) | |
| 539 : callback_(callback), wait_for_popup_(false) { | |
| 540 } | |
| 541 | |
| 542 CaptureCallback::~CaptureCallback() { | |
| 543 } | |
| 544 | |
| 545 void CaptureCallback::didCompositeAndReadback(const SkBitmap& bitmap) { | |
| 546 TRACE_EVENT2("shell", | |
| 547 "CaptureCallback::didCompositeAndReadback", | |
| 548 "x", | |
| 549 bitmap.info().fWidth, | |
| 550 "y", | |
| 551 bitmap.info().fHeight); | |
| 552 if (!wait_for_popup_) { | |
| 553 callback_.Run(bitmap); | |
| 554 delete this; | |
| 555 return; | |
| 556 } | |
| 557 if (main_bitmap_.isNull()) { | |
| 558 bitmap.deepCopyTo(&main_bitmap_); | |
| 559 return; | |
| 560 } | |
| 561 SkCanvas canvas(main_bitmap_); | |
| 562 canvas.drawBitmap(bitmap, popup_position_.x(), popup_position_.y()); | |
| 563 callback_.Run(main_bitmap_); | |
| 564 delete this; | |
| 565 } | |
| 566 | |
| 531 void WebTestProxyBase::CapturePixelsAsync( | 567 void WebTestProxyBase::CapturePixelsAsync( |
| 532 const base::Callback<void(const SkBitmap&)>& callback) { | 568 const base::Callback<void(const SkBitmap&)>& callback) { |
| 533 TRACE_EVENT0("shell", "WebTestProxyBase::CapturePixelsAsync"); | 569 TRACE_EVENT0("shell", "WebTestProxyBase::CapturePixelsAsync"); |
| 534 | 570 |
| 535 DCHECK(web_widget_->isAcceleratedCompositingActive()); | 571 DCHECK(web_widget_->isAcceleratedCompositingActive()); |
| 536 DCHECK(!callback.is_null()); | 572 DCHECK(!callback.is_null()); |
| 537 | 573 |
| 538 if (test_interfaces_->GetTestRunner()->isPrinting()) { | 574 if (test_interfaces_->GetTestRunner()->isPrinting()) { |
| 539 base::MessageLoopProxy::current()->PostTask( | 575 base::MessageLoopProxy::current()->PostTask( |
| 540 FROM_HERE, | 576 FROM_HERE, |
| 541 base::Bind(&WebTestProxyBase::CapturePixelsForPrinting, | 577 base::Bind(&WebTestProxyBase::CapturePixelsForPrinting, |
| 542 base::Unretained(this), | 578 base::Unretained(this), |
| 543 callback)); | 579 callback)); |
| 544 return; | 580 return; |
| 545 } | 581 } |
| 546 | 582 |
| 547 composite_and_readback_callbacks_.push_back(callback); | 583 CaptureCallback* capture_callback = new CaptureCallback(base::Bind( |
| 548 web_widget_->compositeAndReadbackAsync(this); | 584 &WebTestProxyBase::DidCapturePixelsAsync, base::Unretained(this), |
| 585 callback)); | |
| 586 web_widget_->compositeAndReadbackAsync(capture_callback); | |
| 587 if (blink::WebPagePopup* popup = web_widget_->pagePopup()) { | |
| 588 capture_callback->set_wait_for_popup(true); | |
| 589 capture_callback->set_popup_position(popup->positionRelativeToOwner()); | |
| 590 popup->compositeAndReadbackAsync(capture_callback); | |
| 591 } | |
| 592 } | |
| 593 | |
| 594 void WebTestProxyBase::DidCapturePixelsAsync(const base::Callback<void(const SkB itmap&)>& callback, | |
| 595 const SkBitmap& bitmap) { | |
| 596 SkCanvas canvas(bitmap); | |
| 597 DrawSelectionRect(&canvas); | |
|
keishi
2014/09/18 09:14:17
I forgot to call DrawSelectionRect in my previous
| |
| 598 if (!callback.is_null()) | |
| 599 callback.Run(bitmap); | |
| 549 } | 600 } |
| 550 | 601 |
| 551 void WebTestProxyBase::SetLogConsoleOutput(bool enabled) { | 602 void WebTestProxyBase::SetLogConsoleOutput(bool enabled) { |
| 552 log_console_output_ = enabled; | 603 log_console_output_ = enabled; |
| 553 } | 604 } |
| 554 | 605 |
| 555 void WebTestProxyBase::DidDisplayAsync(const base::Closure& callback, | 606 void WebTestProxyBase::DidDisplayAsync(const base::Closure& callback, |
| 556 const SkBitmap& bitmap) { | 607 const SkBitmap& bitmap) { |
| 557 // Verify we actually composited. | 608 // Verify we actually composited. |
| 558 CHECK_NE(0, bitmap.info().fWidth); | 609 CHECK_NE(0, bitmap.info().fWidth); |
| (...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1288 if (!push_client_.get()) | 1339 if (!push_client_.get()) |
| 1289 push_client_.reset(new MockWebPushClient); | 1340 push_client_.reset(new MockWebPushClient); |
| 1290 return push_client_.get(); | 1341 return push_client_.get(); |
| 1291 } | 1342 } |
| 1292 | 1343 |
| 1293 blink::WebPushClient* WebTestProxyBase::GetWebPushClient() { | 1344 blink::WebPushClient* WebTestProxyBase::GetWebPushClient() { |
| 1294 return GetPushClientMock(); | 1345 return GetPushClientMock(); |
| 1295 } | 1346 } |
| 1296 | 1347 |
| 1297 } // namespace content | 1348 } // namespace content |
| OLD | NEW |