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 30 matching lines...) Expand all Loading... |
41 #include "third_party/WebKit/public/web/WebAXObject.h" | 41 #include "third_party/WebKit/public/web/WebAXObject.h" |
42 #include "third_party/WebKit/public/web/WebCachedURLRequest.h" | 42 #include "third_party/WebKit/public/web/WebCachedURLRequest.h" |
43 #include "third_party/WebKit/public/web/WebConsoleMessage.h" | 43 #include "third_party/WebKit/public/web/WebConsoleMessage.h" |
44 #include "third_party/WebKit/public/web/WebDataSource.h" | 44 #include "third_party/WebKit/public/web/WebDataSource.h" |
45 #include "third_party/WebKit/public/web/WebDocument.h" | 45 #include "third_party/WebKit/public/web/WebDocument.h" |
46 #include "third_party/WebKit/public/web/WebElement.h" | 46 #include "third_party/WebKit/public/web/WebElement.h" |
47 #include "third_party/WebKit/public/web/WebHistoryItem.h" | 47 #include "third_party/WebKit/public/web/WebHistoryItem.h" |
48 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 48 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
49 #include "third_party/WebKit/public/web/WebMIDIClientMock.h" | 49 #include "third_party/WebKit/public/web/WebMIDIClientMock.h" |
50 #include "third_party/WebKit/public/web/WebNode.h" | 50 #include "third_party/WebKit/public/web/WebNode.h" |
| 51 #include "third_party/WebKit/public/web/WebPagePopup.h" |
51 #include "third_party/WebKit/public/web/WebPluginParams.h" | 52 #include "third_party/WebKit/public/web/WebPluginParams.h" |
52 #include "third_party/WebKit/public/web/WebPrintParams.h" | 53 #include "third_party/WebKit/public/web/WebPrintParams.h" |
53 #include "third_party/WebKit/public/web/WebRange.h" | 54 #include "third_party/WebKit/public/web/WebRange.h" |
54 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" | 55 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" |
55 #include "third_party/WebKit/public/web/WebView.h" | 56 #include "third_party/WebKit/public/web/WebView.h" |
| 57 #include "third_party/WebKit/public/web/WebWidgetClient.h" |
56 | 58 |
57 namespace content { | 59 namespace content { |
58 | 60 |
59 namespace { | 61 namespace { |
60 | 62 |
| 63 class CaptureCallback : public blink::WebCompositeAndReadbackAsyncCallback { |
| 64 public: |
| 65 CaptureCallback(const base::Callback<void(const SkBitmap&)>& callback); |
| 66 virtual ~CaptureCallback(); |
| 67 |
| 68 void set_wait_for_popup(bool wait) { wait_for_popup_ = wait; } |
| 69 void set_popup_position(const gfx::Point& position) { |
| 70 popup_position_ = position; |
| 71 } |
| 72 |
| 73 // WebCompositeAndReadbackAsyncCallback implementation. |
| 74 virtual void didCompositeAndReadback(const SkBitmap& bitmap); |
| 75 |
| 76 private: |
| 77 base::Callback<void(const SkBitmap&)> callback_; |
| 78 SkBitmap main_bitmap_; |
| 79 bool wait_for_popup_; |
| 80 gfx::Point popup_position_; |
| 81 }; |
| 82 |
61 class HostMethodTask : public WebMethodTask<WebTestProxyBase> { | 83 class HostMethodTask : public WebMethodTask<WebTestProxyBase> { |
62 public: | 84 public: |
63 typedef void (WebTestProxyBase::*CallbackMethodType)(); | 85 typedef void (WebTestProxyBase::*CallbackMethodType)(); |
64 HostMethodTask(WebTestProxyBase* object, CallbackMethodType callback) | 86 HostMethodTask(WebTestProxyBase* object, CallbackMethodType callback) |
65 : WebMethodTask<WebTestProxyBase>(object), callback_(callback) {} | 87 : WebMethodTask<WebTestProxyBase>(object), callback_(callback) {} |
66 | 88 |
67 virtual void RunIfValid() OVERRIDE { (object_->*callback_)(); } | 89 virtual void RunIfValid() OVERRIDE { (object_->*callback_)(); } |
68 | 90 |
69 private: | 91 private: |
70 CallbackMethodType callback_; | 92 CallbackMethodType callback_; |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 chooser_count_(0) { | 346 chooser_count_(0) { |
325 // TODO(enne): using the scheduler introduces additional composite steps | 347 // TODO(enne): using the scheduler introduces additional composite steps |
326 // that create flakiness. This should go away eventually. | 348 // that create flakiness. This should go away eventually. |
327 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 349 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
328 switches::kDisableSingleThreadProxyScheduler); | 350 switches::kDisableSingleThreadProxyScheduler); |
329 Reset(); | 351 Reset(); |
330 } | 352 } |
331 | 353 |
332 WebTestProxyBase::~WebTestProxyBase() { | 354 WebTestProxyBase::~WebTestProxyBase() { |
333 test_interfaces_->WindowClosed(this); | 355 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 } | 356 } |
338 | 357 |
339 void WebTestProxyBase::SetInterfaces(WebTestInterfaces* interfaces) { | 358 void WebTestProxyBase::SetInterfaces(WebTestInterfaces* interfaces) { |
340 test_interfaces_ = interfaces->testInterfaces(); | 359 test_interfaces_ = interfaces->testInterfaces(); |
341 test_interfaces_->WindowOpened(this); | 360 test_interfaces_->WindowOpened(this); |
342 } | 361 } |
343 | 362 |
344 void WebTestProxyBase::SetDelegate(WebTestDelegate* delegate) { | 363 void WebTestProxyBase::SetDelegate(WebTestDelegate* delegate) { |
345 delegate_ = delegate; | 364 delegate_ = delegate; |
346 spellcheck_->SetDelegate(delegate); | 365 spellcheck_->SetDelegate(delegate); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 SkPaint paint; | 470 SkPaint paint; |
452 paint.setColor(0xFFFF0000); // Fully opaque red | 471 paint.setColor(0xFFFF0000); // Fully opaque red |
453 paint.setStyle(SkPaint::kStroke_Style); | 472 paint.setStyle(SkPaint::kStroke_Style); |
454 paint.setFlags(SkPaint::kAntiAlias_Flag); | 473 paint.setFlags(SkPaint::kAntiAlias_Flag); |
455 paint.setStrokeWidth(1.0f); | 474 paint.setStrokeWidth(1.0f); |
456 SkIRect rect; // Bounding rect | 475 SkIRect rect; // Bounding rect |
457 rect.set(wr.x, wr.y, wr.x + wr.width, wr.y + wr.height); | 476 rect.set(wr.x, wr.y, wr.x + wr.width, wr.y + wr.height); |
458 canvas->drawIRect(rect, paint); | 477 canvas->drawIRect(rect, paint); |
459 } | 478 } |
460 | 479 |
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) { | 480 void WebTestProxyBase::SetAcceptLanguages(const std::string& accept_languages) { |
476 bool notify = accept_languages_ != accept_languages; | 481 bool notify = accept_languages_ != accept_languages; |
477 accept_languages_ = accept_languages; | 482 accept_languages_ = accept_languages; |
478 | 483 |
479 if (notify) | 484 if (notify) |
480 GetWebView()->acceptLanguagesChanged(); | 485 GetWebView()->acceptLanguagesChanged(); |
481 } | 486 } |
482 | 487 |
483 void WebTestProxyBase::CopyImageAtAndCapturePixels( | 488 void WebTestProxyBase::CopyImageAtAndCapturePixels( |
484 int x, int y, const base::Callback<void(const SkBitmap&)>& callback) { | 489 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 } | 526 } |
522 web_frame->printPagesWithBoundaries(canvas.get(), page_size_in_pixels); | 527 web_frame->printPagesWithBoundaries(canvas.get(), page_size_in_pixels); |
523 web_frame->printEnd(); | 528 web_frame->printEnd(); |
524 | 529 |
525 DrawSelectionRect(canvas.get()); | 530 DrawSelectionRect(canvas.get()); |
526 SkBaseDevice* device = skia::GetTopDevice(*canvas); | 531 SkBaseDevice* device = skia::GetTopDevice(*canvas); |
527 const SkBitmap& bitmap = device->accessBitmap(false); | 532 const SkBitmap& bitmap = device->accessBitmap(false); |
528 callback.Run(bitmap); | 533 callback.Run(bitmap); |
529 } | 534 } |
530 | 535 |
| 536 CaptureCallback::CaptureCallback( |
| 537 const base::Callback<void(const SkBitmap&)>& callback) |
| 538 : callback_(callback), wait_for_popup_(false) { |
| 539 } |
| 540 |
| 541 CaptureCallback::~CaptureCallback() { |
| 542 } |
| 543 |
| 544 void CaptureCallback::didCompositeAndReadback(const SkBitmap& bitmap) { |
| 545 TRACE_EVENT2("shell", |
| 546 "CaptureCallback::didCompositeAndReadback", |
| 547 "x", |
| 548 bitmap.info().fWidth, |
| 549 "y", |
| 550 bitmap.info().fHeight); |
| 551 if (!wait_for_popup_) { |
| 552 callback_.Run(bitmap); |
| 553 delete this; |
| 554 return; |
| 555 } |
| 556 if (main_bitmap_.isNull()) { |
| 557 bitmap.deepCopyTo(&main_bitmap_); |
| 558 return; |
| 559 } |
| 560 SkCanvas canvas(main_bitmap_); |
| 561 canvas.drawBitmap(bitmap, popup_position_.x(), popup_position_.y()); |
| 562 callback_.Run(main_bitmap_); |
| 563 delete this; |
| 564 } |
| 565 |
531 void WebTestProxyBase::CapturePixelsAsync( | 566 void WebTestProxyBase::CapturePixelsAsync( |
532 const base::Callback<void(const SkBitmap&)>& callback) { | 567 const base::Callback<void(const SkBitmap&)>& callback) { |
533 TRACE_EVENT0("shell", "WebTestProxyBase::CapturePixelsAsync"); | 568 TRACE_EVENT0("shell", "WebTestProxyBase::CapturePixelsAsync"); |
534 | 569 |
535 DCHECK(web_widget_->isAcceleratedCompositingActive()); | 570 DCHECK(web_widget_->isAcceleratedCompositingActive()); |
536 DCHECK(!callback.is_null()); | 571 DCHECK(!callback.is_null()); |
537 | 572 |
538 if (test_interfaces_->GetTestRunner()->isPrinting()) { | 573 if (test_interfaces_->GetTestRunner()->isPrinting()) { |
539 base::MessageLoopProxy::current()->PostTask( | 574 base::MessageLoopProxy::current()->PostTask( |
540 FROM_HERE, | 575 FROM_HERE, |
541 base::Bind(&WebTestProxyBase::CapturePixelsForPrinting, | 576 base::Bind(&WebTestProxyBase::CapturePixelsForPrinting, |
542 base::Unretained(this), | 577 base::Unretained(this), |
543 callback)); | 578 callback)); |
544 return; | 579 return; |
545 } | 580 } |
546 | 581 |
547 composite_and_readback_callbacks_.push_back(callback); | 582 CaptureCallback* capture_callback = new CaptureCallback(callback); |
548 web_widget_->compositeAndReadbackAsync(this); | 583 web_widget_->compositeAndReadbackAsync(capture_callback); |
| 584 if (blink::WebPagePopup* popup = web_widget_->pagePopup()) { |
| 585 capture_callback->set_wait_for_popup(true); |
| 586 capture_callback->set_popup_position( |
| 587 popup->positionRelativeToOwner()); |
| 588 popup->compositeAndReadbackAsync(capture_callback); |
| 589 } |
549 } | 590 } |
550 | 591 |
551 void WebTestProxyBase::SetLogConsoleOutput(bool enabled) { | 592 void WebTestProxyBase::SetLogConsoleOutput(bool enabled) { |
552 log_console_output_ = enabled; | 593 log_console_output_ = enabled; |
553 } | 594 } |
554 | 595 |
555 void WebTestProxyBase::DidDisplayAsync(const base::Closure& callback, | 596 void WebTestProxyBase::DidDisplayAsync(const base::Closure& callback, |
556 const SkBitmap& bitmap) { | 597 const SkBitmap& bitmap) { |
557 // Verify we actually composited. | 598 // Verify we actually composited. |
558 CHECK_NE(0, bitmap.info().fWidth); | 599 CHECK_NE(0, bitmap.info().fWidth); |
(...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1288 if (!push_client_.get()) | 1329 if (!push_client_.get()) |
1289 push_client_.reset(new MockWebPushClient); | 1330 push_client_.reset(new MockWebPushClient); |
1290 return push_client_.get(); | 1331 return push_client_.get(); |
1291 } | 1332 } |
1292 | 1333 |
1293 blink::WebPushClient* WebTestProxyBase::GetWebPushClient() { | 1334 blink::WebPushClient* WebTestProxyBase::GetWebPushClient() { |
1294 return GetPushClientMock(); | 1335 return GetPushClientMock(); |
1295 } | 1336 } |
1296 | 1337 |
1297 } // namespace content | 1338 } // namespace content |
OLD | NEW |