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/browser/renderer_host/render_widget_host_view_mac.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h" |
6 | 6 |
7 #import <objc/runtime.h> | 7 #import <objc/runtime.h> |
8 #include <OpenGL/gl.h> | 8 #include <OpenGL/gl.h> |
9 #include <QuartzCore/QuartzCore.h> | 9 #include <QuartzCore/QuartzCore.h> |
10 | 10 |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 } | 388 } |
389 | 389 |
390 } // namespace | 390 } // namespace |
391 | 391 |
392 namespace content { | 392 namespace content { |
393 | 393 |
394 //////////////////////////////////////////////////////////////////////////////// | 394 //////////////////////////////////////////////////////////////////////////////// |
395 // DelegatedFrameHost, public: | 395 // DelegatedFrameHost, public: |
396 | 396 |
397 ui::Compositor* RenderWidgetHostViewMac::GetCompositor() const { | 397 ui::Compositor* RenderWidgetHostViewMac::GetCompositor() const { |
398 // When |browser_compositor_view_| is suspended or destroyed, the connection | 398 // When |browser_compositor_| is suspended or destroyed, the connection |
399 // between its ui::Compositor and |delegated_frame_host_| has been severed. | 399 // between its ui::Compositor and |delegated_frame_host_| has been severed. |
400 if (browser_compositor_state_ == BrowserCompositorActive) | 400 if (browser_compositor_state_ == BrowserCompositorActive) |
401 return browser_compositor_view_->GetCompositor(); | 401 return browser_compositor_->compositor(); |
402 return NULL; | 402 return NULL; |
403 } | 403 } |
404 | 404 |
405 ui::Layer* RenderWidgetHostViewMac::GetLayer() { | 405 ui::Layer* RenderWidgetHostViewMac::GetLayer() { |
406 return root_layer_.get(); | 406 return root_layer_.get(); |
407 } | 407 } |
408 | 408 |
409 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { | 409 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { |
410 return render_widget_host_; | 410 return render_widget_host_; |
411 } | 411 } |
(...skipping 21 matching lines...) Expand all Loading... |
433 NOTREACHED(); | 433 NOTREACHED(); |
434 ResizeLock* lock = NULL; | 434 ResizeLock* lock = NULL; |
435 return scoped_ptr<ResizeLock>(lock); | 435 return scoped_ptr<ResizeLock>(lock); |
436 } | 436 } |
437 | 437 |
438 DelegatedFrameHost* RenderWidgetHostViewMac::GetDelegatedFrameHost() const { | 438 DelegatedFrameHost* RenderWidgetHostViewMac::GetDelegatedFrameHost() const { |
439 return delegated_frame_host_.get(); | 439 return delegated_frame_host_.get(); |
440 } | 440 } |
441 | 441 |
442 //////////////////////////////////////////////////////////////////////////////// | 442 //////////////////////////////////////////////////////////////////////////////// |
443 // BrowserCompositorViewMacClient, public: | 443 // AcceleratedWidgetMacNSView, public: |
444 | 444 |
445 bool RenderWidgetHostViewMac::BrowserCompositorViewShouldAckImmediately() | 445 NSView* RenderWidgetHostViewMac::AcceleratedWidgetGetNSView() const { |
| 446 return cocoa_view_; |
| 447 } |
| 448 |
| 449 bool RenderWidgetHostViewMac::AcceleratedWidgetShouldIgnoreBackpressure() |
446 const { | 450 const { |
447 // If vsync is disabled, then always draw and ack frames immediately. | 451 // If vsync is disabled, then always draw and ack frames immediately. |
448 static bool is_vsync_disabled = | 452 static bool is_vsync_disabled = |
449 base::CommandLine::ForCurrentProcess()->HasSwitch( | 453 base::CommandLine::ForCurrentProcess()->HasSwitch( |
450 switches::kDisableGpuVsync); | 454 switches::kDisableGpuVsync); |
451 if (is_vsync_disabled) | 455 if (is_vsync_disabled) |
452 return true; | 456 return true; |
453 | 457 |
454 // If the window is occluded, then this frame's display call may be severely | 458 // If the window is occluded, then this frame's display call may be severely |
455 // throttled. This is a good thing, unless tab capture may be active, because | 459 // throttled. This is a good thing, unless tab capture may be active, because |
(...skipping 21 matching lines...) Expand all Loading... |
477 // immediately. | 481 // immediately. |
478 return true; | 482 return true; |
479 } | 483 } |
480 } | 484 } |
481 | 485 |
482 // If the window occlusion API is not present then ack frames when we draw | 486 // If the window occlusion API is not present then ack frames when we draw |
483 // them. | 487 // them. |
484 return false; | 488 return false; |
485 } | 489 } |
486 | 490 |
487 void RenderWidgetHostViewMac::BrowserCompositorViewFrameSwapped( | 491 void RenderWidgetHostViewMac::AcceleratedWidgetSwapCompleted( |
488 const std::vector<ui::LatencyInfo>& all_latency_info) { | 492 const std::vector<ui::LatencyInfo>& all_latency_info) { |
489 if (!render_widget_host_) | 493 if (!render_widget_host_) |
490 return; | 494 return; |
491 for (auto latency_info : all_latency_info) { | 495 for (auto latency_info : all_latency_info) { |
492 latency_info.AddLatencyNumber( | 496 latency_info.AddLatencyNumber( |
493 ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0); | 497 ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0); |
494 render_widget_host_->FrameSwapped(latency_info); | 498 render_widget_host_->FrameSwapped(latency_info); |
495 } | 499 } |
496 } | 500 } |
497 | 501 |
| 502 void RenderWidgetHostViewMac::AcceleratedWidgetHitError() { |
| 503 // Request a new frame be drawn. |
| 504 browser_compositor_->compositor()->ScheduleFullRedraw(); |
| 505 } |
| 506 |
498 /////////////////////////////////////////////////////////////////////////////// | 507 /////////////////////////////////////////////////////////////////////////////// |
499 // RenderWidgetHostViewBase, public: | 508 // RenderWidgetHostViewBase, public: |
500 | 509 |
501 // static | 510 // static |
502 void RenderWidgetHostViewBase::GetDefaultScreenInfo( | 511 void RenderWidgetHostViewBase::GetDefaultScreenInfo( |
503 blink::WebScreenInfo* results) { | 512 blink::WebScreenInfo* results) { |
504 *results = GetWebScreenInfo(NULL); | 513 *results = GetWebScreenInfo(NULL); |
505 } | 514 } |
506 | 515 |
507 /////////////////////////////////////////////////////////////////////////////// | 516 /////////////////////////////////////////////////////////////////////////////// |
508 // RenderWidgetHostViewMac, public: | 517 // RenderWidgetHostViewMac, public: |
509 | 518 |
510 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget, | 519 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget, |
511 bool is_guest_view_hack) | 520 bool is_guest_view_hack) |
512 : render_widget_host_(RenderWidgetHostImpl::From(widget)), | 521 : render_widget_host_(RenderWidgetHostImpl::From(widget)), |
513 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 522 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
514 can_compose_inline_(true), | 523 can_compose_inline_(true), |
515 browser_compositor_state_(BrowserCompositorDestroyed), | 524 browser_compositor_state_(BrowserCompositorDestroyed), |
516 browser_compositor_view_placeholder_( | 525 browser_compositor_placeholder_(new BrowserCompositorMacPlaceholder), |
517 new BrowserCompositorViewPlaceholderMac), | |
518 is_loading_(false), | 526 is_loading_(false), |
519 allow_pause_for_resize_or_repaint_(true), | 527 allow_pause_for_resize_or_repaint_(true), |
520 is_guest_view_hack_(is_guest_view_hack), | 528 is_guest_view_hack_(is_guest_view_hack), |
521 weak_factory_(this), | 529 weak_factory_(this), |
522 fullscreen_parent_host_view_(NULL) { | 530 fullscreen_parent_host_view_(NULL) { |
523 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| | 531 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| |
524 // goes away. Since we autorelease it, our caller must put | 532 // goes away. Since we autorelease it, our caller must put |
525 // |GetNativeView()| into the view hierarchy right after calling us. | 533 // |GetNativeView()| into the view hierarchy right after calling us. |
526 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] | 534 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] |
527 initWithRenderWidgetHostViewMac:this] autorelease]; | 535 initWithRenderWidgetHostViewMac:this] autorelease]; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 | 589 |
582 /////////////////////////////////////////////////////////////////////////////// | 590 /////////////////////////////////////////////////////////////////////////////// |
583 // RenderWidgetHostViewMac, RenderWidgetHostView implementation: | 591 // RenderWidgetHostViewMac, RenderWidgetHostView implementation: |
584 | 592 |
585 void RenderWidgetHostViewMac::EnsureBrowserCompositorView() { | 593 void RenderWidgetHostViewMac::EnsureBrowserCompositorView() { |
586 TRACE_EVENT0("browser", | 594 TRACE_EVENT0("browser", |
587 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); | 595 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); |
588 | 596 |
589 // Create the view, to transition from Destroyed -> Suspended. | 597 // Create the view, to transition from Destroyed -> Suspended. |
590 if (browser_compositor_state_ == BrowserCompositorDestroyed) { | 598 if (browser_compositor_state_ == BrowserCompositorDestroyed) { |
591 browser_compositor_view_.reset( | 599 browser_compositor_ = BrowserCompositorMac::Create(); |
592 new BrowserCompositorViewMac(this, cocoa_view_, root_layer_.get())); | 600 browser_compositor_->compositor()->SetRootLayer( |
| 601 root_layer_.get()); |
| 602 browser_compositor_->accelerated_widget_mac()->SetNSView(this); |
| 603 browser_compositor_->compositor()->SetVisible(true); |
593 browser_compositor_state_ = BrowserCompositorSuspended; | 604 browser_compositor_state_ = BrowserCompositorSuspended; |
594 } | 605 } |
595 | 606 |
596 // Show the DelegatedFrameHost to transition from Suspended -> Active. | 607 // Show the DelegatedFrameHost to transition from Suspended -> Active. |
597 if (browser_compositor_state_ == BrowserCompositorSuspended) { | 608 if (browser_compositor_state_ == BrowserCompositorSuspended) { |
598 delegated_frame_host_->AddedToWindow(); | 609 delegated_frame_host_->AddedToWindow(); |
599 delegated_frame_host_->WasShown(ui::LatencyInfo()); | 610 delegated_frame_host_->WasShown(ui::LatencyInfo()); |
600 browser_compositor_state_ = BrowserCompositorActive; | 611 browser_compositor_state_ = BrowserCompositorActive; |
601 } | 612 } |
602 } | 613 } |
(...skipping 14 matching lines...) Expand all Loading... |
617 | 628 |
618 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { | 629 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { |
619 TRACE_EVENT0("browser", | 630 TRACE_EVENT0("browser", |
620 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); | 631 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); |
621 | 632 |
622 // Transition from Active -> Suspended if need be. | 633 // Transition from Active -> Suspended if need be. |
623 SuspendBrowserCompositorView(); | 634 SuspendBrowserCompositorView(); |
624 | 635 |
625 // Destroy the BrowserCompositorView to transition Suspended -> Destroyed. | 636 // Destroy the BrowserCompositorView to transition Suspended -> Destroyed. |
626 if (browser_compositor_state_ == BrowserCompositorSuspended) { | 637 if (browser_compositor_state_ == BrowserCompositorSuspended) { |
627 browser_compositor_view_.reset(); | 638 browser_compositor_->accelerated_widget_mac()->ResetNSView(); |
| 639 browser_compositor_->compositor()->SetVisible(false); |
| 640 browser_compositor_->compositor()->SetScaleAndSize(1.0, gfx::Size(0, 0)); |
| 641 browser_compositor_->compositor()->SetRootLayer(NULL); |
| 642 BrowserCompositorMac::Recycle(browser_compositor_.Pass()); |
628 browser_compositor_state_ = BrowserCompositorDestroyed; | 643 browser_compositor_state_ = BrowserCompositorDestroyed; |
629 } | 644 } |
630 } | 645 } |
631 | 646 |
632 void RenderWidgetHostViewMac::DestroySuspendedBrowserCompositorViewIfNeeded() { | 647 void RenderWidgetHostViewMac::DestroySuspendedBrowserCompositorViewIfNeeded() { |
633 if (browser_compositor_state_ != BrowserCompositorSuspended) | 648 if (browser_compositor_state_ != BrowserCompositorSuspended) |
634 return; | 649 return; |
635 | 650 |
636 // If this view is in a window that is visible, keep around the suspended | 651 // If this view is in a window that is visible, keep around the suspended |
637 // BrowserCompositorView in case |cocoa_view_| is suddenly revealed (so that | 652 // BrowserCompositorView in case |cocoa_view_| is suddenly revealed (so that |
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1393 if (actual_range) { | 1408 if (actual_range) { |
1394 *actual_range = gfx::Range( | 1409 *actual_range = gfx::Range( |
1395 composition_range_.start() + ui_actual_range.start(), | 1410 composition_range_.start() + ui_actual_range.start(), |
1396 composition_range_.start() + ui_actual_range.end()).ToNSRange(); | 1411 composition_range_.start() + ui_actual_range.end()).ToNSRange(); |
1397 } | 1412 } |
1398 return true; | 1413 return true; |
1399 } | 1414 } |
1400 | 1415 |
1401 bool RenderWidgetHostViewMac::HasAcceleratedSurface( | 1416 bool RenderWidgetHostViewMac::HasAcceleratedSurface( |
1402 const gfx::Size& desired_size) { | 1417 const gfx::Size& desired_size) { |
1403 if (browser_compositor_view_) | 1418 if (browser_compositor_) { |
1404 return browser_compositor_view_->HasFrameOfSize(desired_size); | 1419 return browser_compositor_->accelerated_widget_mac()->HasFrameOfSize( |
| 1420 desired_size); |
| 1421 } |
1405 return false; | 1422 return false; |
1406 } | 1423 } |
1407 | 1424 |
1408 void RenderWidgetHostViewMac::OnSwapCompositorFrame( | 1425 void RenderWidgetHostViewMac::OnSwapCompositorFrame( |
1409 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { | 1426 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { |
1410 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); | 1427 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); |
1411 | 1428 |
1412 last_scroll_offset_ = frame->metadata.root_scroll_offset; | 1429 last_scroll_offset_ = frame->metadata.root_scroll_offset; |
1413 if (frame->delegated_frame_data) { | 1430 if (frame->delegated_frame_data) { |
1414 float scale_factor = frame->metadata.device_scale_factor; | 1431 float scale_factor = frame->metadata.device_scale_factor; |
1415 | 1432 |
1416 // Compute the frame size based on the root render pass rect size. | 1433 // Compute the frame size based on the root render pass rect size. |
1417 cc::RenderPass* root_pass = | 1434 cc::RenderPass* root_pass = |
1418 frame->delegated_frame_data->render_pass_list.back(); | 1435 frame->delegated_frame_data->render_pass_list.back(); |
1419 gfx::Size pixel_size = root_pass->output_rect.size(); | 1436 gfx::Size pixel_size = root_pass->output_rect.size(); |
1420 gfx::Size dip_size = | 1437 gfx::Size dip_size = |
1421 ConvertSizeToDIP(scale_factor, pixel_size); | 1438 ConvertSizeToDIP(scale_factor, pixel_size); |
1422 | 1439 |
1423 root_layer_->SetBounds(gfx::Rect(dip_size)); | 1440 root_layer_->SetBounds(gfx::Rect(dip_size)); |
1424 if (!render_widget_host_->is_hidden()) { | 1441 if (!render_widget_host_->is_hidden()) { |
1425 EnsureBrowserCompositorView(); | 1442 EnsureBrowserCompositorView(); |
1426 browser_compositor_view_->GetCompositor()->SetScaleAndSize( | 1443 browser_compositor_->compositor()->SetScaleAndSize( |
1427 scale_factor, pixel_size); | 1444 scale_factor, pixel_size); |
1428 } | 1445 } |
1429 | 1446 |
1430 SendVSyncParametersToRenderer(); | 1447 SendVSyncParametersToRenderer(); |
1431 | 1448 |
1432 delegated_frame_host_->SwapDelegatedFrame( | 1449 delegated_frame_host_->SwapDelegatedFrame( |
1433 output_surface_id, | 1450 output_surface_id, |
1434 frame->delegated_frame_data.Pass(), | 1451 frame->delegated_frame_data.Pass(), |
1435 frame->metadata.device_scale_factor, | 1452 frame->metadata.device_scale_factor, |
1436 frame->metadata.latency_info); | 1453 frame->metadata.latency_info); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1513 void RenderWidgetHostViewMac::ShutdownHost() { | 1530 void RenderWidgetHostViewMac::ShutdownHost() { |
1514 weak_factory_.InvalidateWeakPtrs(); | 1531 weak_factory_.InvalidateWeakPtrs(); |
1515 render_widget_host_->Shutdown(); | 1532 render_widget_host_->Shutdown(); |
1516 // Do not touch any members at this point, |this| has been deleted. | 1533 // Do not touch any members at this point, |this| has been deleted. |
1517 } | 1534 } |
1518 | 1535 |
1519 void RenderWidgetHostViewMac::ShutdownBrowserCompositor() { | 1536 void RenderWidgetHostViewMac::ShutdownBrowserCompositor() { |
1520 DestroyBrowserCompositorView(); | 1537 DestroyBrowserCompositorView(); |
1521 delegated_frame_host_.reset(); | 1538 delegated_frame_host_.reset(); |
1522 root_layer_.reset(); | 1539 root_layer_.reset(); |
1523 browser_compositor_view_placeholder_.reset(); | 1540 browser_compositor_placeholder_.reset(); |
1524 } | 1541 } |
1525 | 1542 |
1526 void RenderWidgetHostViewMac::SetActive(bool active) { | 1543 void RenderWidgetHostViewMac::SetActive(bool active) { |
1527 if (render_widget_host_) { | 1544 if (render_widget_host_) { |
1528 render_widget_host_->SetActive(active); | 1545 render_widget_host_->SetActive(active); |
1529 if (active) { | 1546 if (active) { |
1530 if (HasFocus()) | 1547 if (HasFocus()) |
1531 render_widget_host_->Focus(); | 1548 render_widget_host_->Focus(); |
1532 } else { | 1549 } else { |
1533 render_widget_host_->Blur(); | 1550 render_widget_host_->Blur(); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1639 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() { | 1656 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() { |
1640 if (!render_widget_host_ || render_widget_host_->is_hidden()) | 1657 if (!render_widget_host_ || render_widget_host_->is_hidden()) |
1641 return; | 1658 return; |
1642 | 1659 |
1643 // Pausing for one view prevents others from receiving frames. | 1660 // Pausing for one view prevents others from receiving frames. |
1644 // This may lead to large delays, causing overlaps. See crbug.com/352020. | 1661 // This may lead to large delays, causing overlaps. See crbug.com/352020. |
1645 if (!allow_pause_for_resize_or_repaint_) | 1662 if (!allow_pause_for_resize_or_repaint_) |
1646 return; | 1663 return; |
1647 | 1664 |
1648 // Wait for a frame of the right size to come in. | 1665 // Wait for a frame of the right size to come in. |
1649 if (browser_compositor_view_) | 1666 if (browser_compositor_) |
1650 browser_compositor_view_->BeginPumpingFrames(); | 1667 browser_compositor_->accelerated_widget_mac()->BeginPumpingFrames(); |
1651 render_widget_host_->PauseForPendingResizeOrRepaints(); | 1668 render_widget_host_->PauseForPendingResizeOrRepaints(); |
1652 if (browser_compositor_view_) | 1669 if (browser_compositor_) |
1653 browser_compositor_view_->EndPumpingFrames(); | 1670 browser_compositor_->accelerated_widget_mac()->EndPumpingFrames(); |
1654 } | 1671 } |
1655 | 1672 |
1656 SkColorType RenderWidgetHostViewMac::PreferredReadbackFormat() { | 1673 SkColorType RenderWidgetHostViewMac::PreferredReadbackFormat() { |
1657 return kN32_SkColorType; | 1674 return kN32_SkColorType; |
1658 } | 1675 } |
1659 | 1676 |
1660 //////////////////////////////////////////////////////////////////////////////// | 1677 //////////////////////////////////////////////////////////////////////////////// |
1661 // gfx::DisplayObserver, public: | 1678 // gfx::DisplayObserver, public: |
1662 | 1679 |
1663 void RenderWidgetHostViewMac::OnDisplayAdded(const gfx::Display& display) { | 1680 void RenderWidgetHostViewMac::OnDisplayAdded(const gfx::Display& display) { |
(...skipping 1690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3354 | 3371 |
3355 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding | 3372 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding |
3356 // regions that are not draggable. (See ControlRegionView in | 3373 // regions that are not draggable. (See ControlRegionView in |
3357 // native_app_window_cocoa.mm). This requires the render host view to be | 3374 // native_app_window_cocoa.mm). This requires the render host view to be |
3358 // draggable by default. | 3375 // draggable by default. |
3359 - (BOOL)mouseDownCanMoveWindow { | 3376 - (BOOL)mouseDownCanMoveWindow { |
3360 return YES; | 3377 return YES; |
3361 } | 3378 } |
3362 | 3379 |
3363 @end | 3380 @end |
OLD | NEW |