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_( |
517 new BrowserCompositorViewPlaceholderMac), | 526 new BrowserCompositorMacPlaceholder), |
tapted
2014/11/20 05:38:54
nit: pull up?
ccameron
2014/11/20 21:33:51
Done.
| |
518 is_loading_(false), | 527 is_loading_(false), |
519 allow_pause_for_resize_or_repaint_(true), | 528 allow_pause_for_resize_or_repaint_(true), |
520 is_guest_view_hack_(is_guest_view_hack), | 529 is_guest_view_hack_(is_guest_view_hack), |
521 weak_factory_(this), | 530 weak_factory_(this), |
522 fullscreen_parent_host_view_(NULL) { | 531 fullscreen_parent_host_view_(NULL) { |
523 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| | 532 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| |
524 // goes away. Since we autorelease it, our caller must put | 533 // goes away. Since we autorelease it, our caller must put |
525 // |GetNativeView()| into the view hierarchy right after calling us. | 534 // |GetNativeView()| into the view hierarchy right after calling us. |
526 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] | 535 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] |
527 initWithRenderWidgetHostViewMac:this] autorelease]; | 536 initWithRenderWidgetHostViewMac:this] autorelease]; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
581 | 590 |
582 /////////////////////////////////////////////////////////////////////////////// | 591 /////////////////////////////////////////////////////////////////////////////// |
583 // RenderWidgetHostViewMac, RenderWidgetHostView implementation: | 592 // RenderWidgetHostViewMac, RenderWidgetHostView implementation: |
584 | 593 |
585 void RenderWidgetHostViewMac::EnsureBrowserCompositorView() { | 594 void RenderWidgetHostViewMac::EnsureBrowserCompositorView() { |
586 TRACE_EVENT0("browser", | 595 TRACE_EVENT0("browser", |
587 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); | 596 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); |
588 | 597 |
589 // Create the view, to transition from Destroyed -> Suspended. | 598 // Create the view, to transition from Destroyed -> Suspended. |
590 if (browser_compositor_state_ == BrowserCompositorDestroyed) { | 599 if (browser_compositor_state_ == BrowserCompositorDestroyed) { |
591 browser_compositor_view_.reset( | 600 BrowserCompositorMac::AcquireCompositor(&browser_compositor_); |
592 new BrowserCompositorViewMac(this, cocoa_view_, root_layer_.get())); | 601 browser_compositor_->compositor()->SetRootLayer( |
602 root_layer_.get()); | |
603 browser_compositor_->accelerated_widget_mac()->SetClient(this); | |
604 browser_compositor_->compositor()->SetVisible(true); | |
593 browser_compositor_state_ = BrowserCompositorSuspended; | 605 browser_compositor_state_ = BrowserCompositorSuspended; |
594 } | 606 } |
595 | 607 |
596 // Show the DelegatedFrameHost to transition from Suspended -> Active. | 608 // Show the DelegatedFrameHost to transition from Suspended -> Active. |
597 if (browser_compositor_state_ == BrowserCompositorSuspended) { | 609 if (browser_compositor_state_ == BrowserCompositorSuspended) { |
598 delegated_frame_host_->AddedToWindow(); | 610 delegated_frame_host_->AddedToWindow(); |
599 delegated_frame_host_->WasShown(ui::LatencyInfo()); | 611 delegated_frame_host_->WasShown(ui::LatencyInfo()); |
600 browser_compositor_state_ = BrowserCompositorActive; | 612 browser_compositor_state_ = BrowserCompositorActive; |
601 } | 613 } |
602 } | 614 } |
(...skipping 14 matching lines...) Expand all Loading... | |
617 | 629 |
618 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { | 630 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { |
619 TRACE_EVENT0("browser", | 631 TRACE_EVENT0("browser", |
620 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); | 632 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); |
621 | 633 |
622 // Transition from Active -> Suspended if need be. | 634 // Transition from Active -> Suspended if need be. |
623 SuspendBrowserCompositorView(); | 635 SuspendBrowserCompositorView(); |
624 | 636 |
625 // Destroy the BrowserCompositorView to transition Suspended -> Destroyed. | 637 // Destroy the BrowserCompositorView to transition Suspended -> Destroyed. |
626 if (browser_compositor_state_ == BrowserCompositorSuspended) { | 638 if (browser_compositor_state_ == BrowserCompositorSuspended) { |
627 browser_compositor_view_.reset(); | 639 browser_compositor_->accelerated_widget_mac()->ResetClient(); |
640 browser_compositor_->compositor()->SetVisible(false); | |
641 browser_compositor_->compositor()->SetScaleAndSize(1.0, gfx::Size(0, 0)); | |
642 browser_compositor_->compositor()->SetRootLayer(NULL); | |
643 BrowserCompositorMac::ReleaseCompositor(&browser_compositor_); | |
628 browser_compositor_state_ = BrowserCompositorDestroyed; | 644 browser_compositor_state_ = BrowserCompositorDestroyed; |
629 } | 645 } |
630 } | 646 } |
631 | 647 |
632 void RenderWidgetHostViewMac::DestroySuspendedBrowserCompositorViewIfNeeded() { | 648 void RenderWidgetHostViewMac::DestroySuspendedBrowserCompositorViewIfNeeded() { |
633 if (browser_compositor_state_ != BrowserCompositorSuspended) | 649 if (browser_compositor_state_ != BrowserCompositorSuspended) |
634 return; | 650 return; |
635 | 651 |
636 // If this view is in a window that is visible, keep around the suspended | 652 // 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 | 653 // 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) { | 1409 if (actual_range) { |
1394 *actual_range = gfx::Range( | 1410 *actual_range = gfx::Range( |
1395 composition_range_.start() + ui_actual_range.start(), | 1411 composition_range_.start() + ui_actual_range.start(), |
1396 composition_range_.start() + ui_actual_range.end()).ToNSRange(); | 1412 composition_range_.start() + ui_actual_range.end()).ToNSRange(); |
1397 } | 1413 } |
1398 return true; | 1414 return true; |
1399 } | 1415 } |
1400 | 1416 |
1401 bool RenderWidgetHostViewMac::HasAcceleratedSurface( | 1417 bool RenderWidgetHostViewMac::HasAcceleratedSurface( |
1402 const gfx::Size& desired_size) { | 1418 const gfx::Size& desired_size) { |
1403 if (browser_compositor_view_) | 1419 if (browser_compositor_) { |
1404 return browser_compositor_view_->HasFrameOfSize(desired_size); | 1420 return browser_compositor_->accelerated_widget_mac()->HasFrameOfSize( |
1421 desired_size); | |
1422 } | |
1405 return false; | 1423 return false; |
1406 } | 1424 } |
1407 | 1425 |
1408 void RenderWidgetHostViewMac::OnSwapCompositorFrame( | 1426 void RenderWidgetHostViewMac::OnSwapCompositorFrame( |
1409 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { | 1427 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { |
1410 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); | 1428 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); |
1411 | 1429 |
1412 last_scroll_offset_ = frame->metadata.root_scroll_offset; | 1430 last_scroll_offset_ = frame->metadata.root_scroll_offset; |
1413 if (frame->delegated_frame_data) { | 1431 if (frame->delegated_frame_data) { |
1414 float scale_factor = frame->metadata.device_scale_factor; | 1432 float scale_factor = frame->metadata.device_scale_factor; |
1415 | 1433 |
1416 // Compute the frame size based on the root render pass rect size. | 1434 // Compute the frame size based on the root render pass rect size. |
1417 cc::RenderPass* root_pass = | 1435 cc::RenderPass* root_pass = |
1418 frame->delegated_frame_data->render_pass_list.back(); | 1436 frame->delegated_frame_data->render_pass_list.back(); |
1419 gfx::Size pixel_size = root_pass->output_rect.size(); | 1437 gfx::Size pixel_size = root_pass->output_rect.size(); |
1420 gfx::Size dip_size = | 1438 gfx::Size dip_size = |
1421 ConvertSizeToDIP(scale_factor, pixel_size); | 1439 ConvertSizeToDIP(scale_factor, pixel_size); |
1422 | 1440 |
1423 root_layer_->SetBounds(gfx::Rect(dip_size)); | 1441 root_layer_->SetBounds(gfx::Rect(dip_size)); |
1424 if (!render_widget_host_->is_hidden()) { | 1442 if (!render_widget_host_->is_hidden()) { |
1425 EnsureBrowserCompositorView(); | 1443 EnsureBrowserCompositorView(); |
1426 browser_compositor_view_->GetCompositor()->SetScaleAndSize( | 1444 browser_compositor_->compositor()->SetScaleAndSize( |
1427 scale_factor, pixel_size); | 1445 scale_factor, pixel_size); |
1428 } | 1446 } |
1429 | 1447 |
1430 SendVSyncParametersToRenderer(); | 1448 SendVSyncParametersToRenderer(); |
1431 | 1449 |
1432 delegated_frame_host_->SwapDelegatedFrame( | 1450 delegated_frame_host_->SwapDelegatedFrame( |
1433 output_surface_id, | 1451 output_surface_id, |
1434 frame->delegated_frame_data.Pass(), | 1452 frame->delegated_frame_data.Pass(), |
1435 frame->metadata.device_scale_factor, | 1453 frame->metadata.device_scale_factor, |
1436 frame->metadata.latency_info); | 1454 frame->metadata.latency_info); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1513 void RenderWidgetHostViewMac::ShutdownHost() { | 1531 void RenderWidgetHostViewMac::ShutdownHost() { |
1514 weak_factory_.InvalidateWeakPtrs(); | 1532 weak_factory_.InvalidateWeakPtrs(); |
1515 render_widget_host_->Shutdown(); | 1533 render_widget_host_->Shutdown(); |
1516 // Do not touch any members at this point, |this| has been deleted. | 1534 // Do not touch any members at this point, |this| has been deleted. |
1517 } | 1535 } |
1518 | 1536 |
1519 void RenderWidgetHostViewMac::ShutdownBrowserCompositor() { | 1537 void RenderWidgetHostViewMac::ShutdownBrowserCompositor() { |
1520 DestroyBrowserCompositorView(); | 1538 DestroyBrowserCompositorView(); |
1521 delegated_frame_host_.reset(); | 1539 delegated_frame_host_.reset(); |
1522 root_layer_.reset(); | 1540 root_layer_.reset(); |
1523 browser_compositor_view_placeholder_.reset(); | 1541 browser_compositor_placeholder_.reset(); |
1524 } | 1542 } |
1525 | 1543 |
1526 void RenderWidgetHostViewMac::SetActive(bool active) { | 1544 void RenderWidgetHostViewMac::SetActive(bool active) { |
1527 if (render_widget_host_) { | 1545 if (render_widget_host_) { |
1528 render_widget_host_->SetActive(active); | 1546 render_widget_host_->SetActive(active); |
1529 if (active) { | 1547 if (active) { |
1530 if (HasFocus()) | 1548 if (HasFocus()) |
1531 render_widget_host_->Focus(); | 1549 render_widget_host_->Focus(); |
1532 } else { | 1550 } else { |
1533 render_widget_host_->Blur(); | 1551 render_widget_host_->Blur(); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1639 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() { | 1657 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() { |
1640 if (!render_widget_host_ || render_widget_host_->is_hidden()) | 1658 if (!render_widget_host_ || render_widget_host_->is_hidden()) |
1641 return; | 1659 return; |
1642 | 1660 |
1643 // Pausing for one view prevents others from receiving frames. | 1661 // Pausing for one view prevents others from receiving frames. |
1644 // This may lead to large delays, causing overlaps. See crbug.com/352020. | 1662 // This may lead to large delays, causing overlaps. See crbug.com/352020. |
1645 if (!allow_pause_for_resize_or_repaint_) | 1663 if (!allow_pause_for_resize_or_repaint_) |
1646 return; | 1664 return; |
1647 | 1665 |
1648 // Wait for a frame of the right size to come in. | 1666 // Wait for a frame of the right size to come in. |
1649 if (browser_compositor_view_) | 1667 if (browser_compositor_) |
1650 browser_compositor_view_->BeginPumpingFrames(); | 1668 browser_compositor_->accelerated_widget_mac()->BeginPumpingFrames(); |
1651 render_widget_host_->PauseForPendingResizeOrRepaints(); | 1669 render_widget_host_->PauseForPendingResizeOrRepaints(); |
1652 if (browser_compositor_view_) | 1670 if (browser_compositor_) |
1653 browser_compositor_view_->EndPumpingFrames(); | 1671 browser_compositor_->accelerated_widget_mac()->EndPumpingFrames(); |
1654 } | 1672 } |
1655 | 1673 |
1656 SkColorType RenderWidgetHostViewMac::PreferredReadbackFormat() { | 1674 SkColorType RenderWidgetHostViewMac::PreferredReadbackFormat() { |
1657 return kN32_SkColorType; | 1675 return kN32_SkColorType; |
1658 } | 1676 } |
1659 | 1677 |
1660 //////////////////////////////////////////////////////////////////////////////// | 1678 //////////////////////////////////////////////////////////////////////////////// |
1661 // gfx::DisplayObserver, public: | 1679 // gfx::DisplayObserver, public: |
1662 | 1680 |
1663 void RenderWidgetHostViewMac::OnDisplayAdded(const gfx::Display& display) { | 1681 void RenderWidgetHostViewMac::OnDisplayAdded(const gfx::Display& display) { |
(...skipping 1690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3354 | 3372 |
3355 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding | 3373 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding |
3356 // regions that are not draggable. (See ControlRegionView in | 3374 // regions that are not draggable. (See ControlRegionView in |
3357 // native_app_window_cocoa.mm). This requires the render host view to be | 3375 // native_app_window_cocoa.mm). This requires the render host view to be |
3358 // draggable by default. | 3376 // draggable by default. |
3359 - (BOOL)mouseDownCanMoveWindow { | 3377 - (BOOL)mouseDownCanMoveWindow { |
3360 return YES; | 3378 return YES; |
3361 } | 3379 } |
3362 | 3380 |
3363 @end | 3381 @end |
OLD | NEW |