| 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_impl.h" | 5 #include "content/browser/renderer_host/render_widget_host_impl.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 | 8 |
| 9 #include <set> | 9 #include <set> |
| 10 #include <tuple> | 10 #include <tuple> |
| (...skipping 1438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1449 } | 1449 } |
| 1450 } | 1450 } |
| 1451 | 1451 |
| 1452 void RenderWidgetHostImpl::GetSnapshotFromBrowser( | 1452 void RenderWidgetHostImpl::GetSnapshotFromBrowser( |
| 1453 const GetSnapshotFromBrowserCallback& callback, | 1453 const GetSnapshotFromBrowserCallback& callback, |
| 1454 bool from_surface) { | 1454 bool from_surface) { |
| 1455 int id = next_browser_snapshot_id_++; | 1455 int id = next_browser_snapshot_id_++; |
| 1456 if (from_surface) { | 1456 if (from_surface) { |
| 1457 pending_surface_browser_snapshots_.insert(std::make_pair(id, callback)); | 1457 pending_surface_browser_snapshots_.insert(std::make_pair(id, callback)); |
| 1458 ui::LatencyInfo latency_info; | 1458 ui::LatencyInfo latency_info; |
| 1459 latency_info.AddLatencyNumber(ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT, 0, | 1459 latency_info.AddLatencyNumber(ui::BROWSER_SNAPSHOT_FRAME_NUMBER_COMPONENT, |
| 1460 id); | 1460 0, id); |
| 1461 Send(new ViewMsg_ForceRedraw(GetRoutingID(), latency_info)); | 1461 Send(new ViewMsg_ForceRedraw(GetRoutingID(), latency_info)); |
| 1462 return; | 1462 return; |
| 1463 } | 1463 } |
| 1464 | 1464 |
| 1465 #if defined(OS_MACOSX) | 1465 #if defined(OS_MACOSX) |
| 1466 // MacOS version of underlying GrabViewSnapshot() blocks while | 1466 // MacOS version of underlying GrabViewSnapshot() blocks while |
| 1467 // display/GPU are in a power-saving mode, so make sure display | 1467 // display/GPU are in a power-saving mode, so make sure display |
| 1468 // does not go to sleep for the duration of reading a snapshot. | 1468 // does not go to sleep for the duration of reading a snapshot. |
| 1469 if (pending_browser_snapshots_.empty()) { | 1469 if (pending_browser_snapshots_.empty()) { |
| 1470 DCHECK(!power_save_blocker_); | 1470 DCHECK(!power_save_blocker_); |
| 1471 power_save_blocker_.reset(new device::PowerSaveBlocker( | 1471 power_save_blocker_.reset(new device::PowerSaveBlocker( |
| 1472 device::PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, | 1472 device::PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, |
| 1473 device::PowerSaveBlocker::kReasonOther, "GetSnapshot", | 1473 device::PowerSaveBlocker::kReasonOther, "GetSnapshot", |
| 1474 BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), | 1474 BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), |
| 1475 BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE))); | 1475 BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE))); |
| 1476 } | 1476 } |
| 1477 #endif | 1477 #endif |
| 1478 pending_browser_snapshots_.insert(std::make_pair(id, callback)); | 1478 pending_browser_snapshots_.insert(std::make_pair(id, callback)); |
| 1479 ui::LatencyInfo latency_info; | 1479 ui::LatencyInfo latency_info; |
| 1480 latency_info.AddLatencyNumber(ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT, 0, | 1480 latency_info.AddLatencyNumber(ui::BROWSER_SNAPSHOT_FRAME_NUMBER_COMPONENT, 0, |
| 1481 id); | 1481 id); |
| 1482 Send(new ViewMsg_ForceRedraw(GetRoutingID(), latency_info)); | 1482 Send(new ViewMsg_ForceRedraw(GetRoutingID(), latency_info)); |
| 1483 } | 1483 } |
| 1484 | 1484 |
| 1485 const NativeWebKeyboardEvent* | 1485 const NativeWebKeyboardEvent* |
| 1486 RenderWidgetHostImpl::GetLastKeyboardEvent() const { | 1486 RenderWidgetHostImpl::GetLastKeyboardEvent() const { |
| 1487 return input_router_->GetLastKeyboardEvent(); | 1487 return input_router_->GetLastKeyboardEvent(); |
| 1488 } | 1488 } |
| 1489 | 1489 |
| 1490 void RenderWidgetHostImpl::SelectionChanged(const base::string16& text, | 1490 void RenderWidgetHostImpl::SelectionChanged(const base::string16& text, |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1753 delegate_->RendererResponsive(this); | 1753 delegate_->RendererResponsive(this); |
| 1754 } | 1754 } |
| 1755 } | 1755 } |
| 1756 | 1756 |
| 1757 void RenderWidgetHostImpl::ClearDisplayedGraphics() { | 1757 void RenderWidgetHostImpl::ClearDisplayedGraphics() { |
| 1758 NotifyNewContentRenderingTimeoutForTesting(); | 1758 NotifyNewContentRenderingTimeoutForTesting(); |
| 1759 if (view_) | 1759 if (view_) |
| 1760 view_->ClearCompositorFrame(); | 1760 view_->ClearCompositorFrame(); |
| 1761 } | 1761 } |
| 1762 | 1762 |
| 1763 void RenderWidgetHostImpl::OnGpuSwapBuffersCompletedInternal( |
| 1764 const ui::LatencyInfo& latency_info) { |
| 1765 ui::LatencyInfo::LatencyComponent window_snapshot_component; |
| 1766 if (latency_info.FindLatency(ui::BROWSER_SNAPSHOT_FRAME_NUMBER_COMPONENT, |
| 1767 GetLatencyComponentId(), |
| 1768 &window_snapshot_component)) { |
| 1769 int sequence_number = |
| 1770 static_cast<int>(window_snapshot_component.sequence_number); |
| 1771 #if defined(OS_MACOSX) |
| 1772 // On Mac, when using CoreAnimation, there is a delay between when content |
| 1773 // is drawn to the screen, and when the snapshot will actually pick up |
| 1774 // that content. Insert a manual delay of 1/6th of a second (to simulate |
| 1775 // 10 frames at 60 fps) before actually taking the snapshot. |
| 1776 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 1777 FROM_HERE, |
| 1778 base::Bind(&RenderWidgetHostImpl::WindowSnapshotReachedScreen, |
| 1779 weak_factory_.GetWeakPtr(), sequence_number), |
| 1780 base::TimeDelta::FromSecondsD(1. / 6)); |
| 1781 #else |
| 1782 WindowSnapshotReachedScreen(sequence_number); |
| 1783 #endif |
| 1784 } |
| 1785 |
| 1786 latency_tracker_.OnGpuSwapBuffersCompleted(latency_info); |
| 1787 } |
| 1788 |
| 1763 void RenderWidgetHostImpl::OnRenderProcessGone(int status, int exit_code) { | 1789 void RenderWidgetHostImpl::OnRenderProcessGone(int status, int exit_code) { |
| 1764 // RenderFrameHost owns a RenderWidgetHost when it needs one, in which case | 1790 // RenderFrameHost owns a RenderWidgetHost when it needs one, in which case |
| 1765 // it handles destruction. | 1791 // it handles destruction. |
| 1766 if (!owned_by_render_frame_host_) { | 1792 if (!owned_by_render_frame_host_) { |
| 1767 // TODO(evanm): This synchronously ends up calling "delete this". | 1793 // TODO(evanm): This synchronously ends up calling "delete this". |
| 1768 // Is that really what we want in response to this message? I'm matching | 1794 // Is that really what we want in response to this message? I'm matching |
| 1769 // previous behavior of the code here. | 1795 // previous behavior of the code here. |
| 1770 Destroy(true); | 1796 Destroy(true); |
| 1771 } else { | 1797 } else { |
| 1772 RendererExited(static_cast<base::TerminationStatus>(status), exit_code); | 1798 RendererExited(static_cast<base::TerminationStatus>(status), exit_code); |
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2335 | 2361 |
| 2336 if (delegate_) | 2362 if (delegate_) |
| 2337 delegate_->ResizeDueToAutoResize(this, new_size); | 2363 delegate_->ResizeDueToAutoResize(this, new_size); |
| 2338 } | 2364 } |
| 2339 | 2365 |
| 2340 void RenderWidgetHostImpl::DetachDelegate() { | 2366 void RenderWidgetHostImpl::DetachDelegate() { |
| 2341 delegate_ = NULL; | 2367 delegate_ = NULL; |
| 2342 latency_tracker_.SetDelegate(nullptr); | 2368 latency_tracker_.SetDelegate(nullptr); |
| 2343 } | 2369 } |
| 2344 | 2370 |
| 2345 void RenderWidgetHostImpl::FrameSwapped(const ui::LatencyInfo& latency_info) { | |
| 2346 ui::LatencyInfo::LatencyComponent window_snapshot_component; | |
| 2347 if (latency_info.FindLatency(ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT, | |
| 2348 GetLatencyComponentId(), | |
| 2349 &window_snapshot_component)) { | |
| 2350 int sequence_number = static_cast<int>( | |
| 2351 window_snapshot_component.sequence_number); | |
| 2352 #if defined(OS_MACOSX) | |
| 2353 // On Mac, when using CoreAnmation, there is a delay between when content | |
| 2354 // is drawn to the screen, and when the snapshot will actually pick up | |
| 2355 // that content. Insert a manual delay of 1/6th of a second (to simulate | |
| 2356 // 10 frames at 60 fps) before actually taking the snapshot. | |
| 2357 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | |
| 2358 FROM_HERE, | |
| 2359 base::Bind(&RenderWidgetHostImpl::WindowSnapshotReachedScreen, | |
| 2360 weak_factory_.GetWeakPtr(), sequence_number), | |
| 2361 base::TimeDelta::FromSecondsD(1. / 6)); | |
| 2362 #else | |
| 2363 WindowSnapshotReachedScreen(sequence_number); | |
| 2364 #endif | |
| 2365 } | |
| 2366 | |
| 2367 latency_tracker_.OnFrameSwapped(latency_info); | |
| 2368 } | |
| 2369 | |
| 2370 void RenderWidgetHostImpl::DidReceiveRendererFrame() { | 2371 void RenderWidgetHostImpl::DidReceiveRendererFrame() { |
| 2371 view_->DidReceiveRendererFrame(); | 2372 view_->DidReceiveRendererFrame(); |
| 2372 } | 2373 } |
| 2373 | 2374 |
| 2374 void RenderWidgetHostImpl::WindowSnapshotReachedScreen(int snapshot_id) { | 2375 void RenderWidgetHostImpl::WindowSnapshotReachedScreen(int snapshot_id) { |
| 2375 DCHECK(base::MessageLoopForUI::IsCurrent()); | 2376 DCHECK(base::MessageLoopForUI::IsCurrent()); |
| 2376 | 2377 |
| 2377 if (!pending_surface_browser_snapshots_.empty()) { | 2378 if (!pending_surface_browser_snapshots_.empty()) { |
| 2378 GetView()->CopyFromSurface( | 2379 GetView()->CopyFromSurface( |
| 2379 gfx::Rect(), gfx::Size(), | 2380 gfx::Rect(), gfx::Size(), |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2450 ++it; | 2451 ++it; |
| 2451 } | 2452 } |
| 2452 } | 2453 } |
| 2453 #if defined(OS_MACOSX) | 2454 #if defined(OS_MACOSX) |
| 2454 if (pending_browser_snapshots_.empty()) | 2455 if (pending_browser_snapshots_.empty()) |
| 2455 power_save_blocker_.reset(); | 2456 power_save_blocker_.reset(); |
| 2456 #endif | 2457 #endif |
| 2457 } | 2458 } |
| 2458 | 2459 |
| 2459 // static | 2460 // static |
| 2460 void RenderWidgetHostImpl::CompositorFrameDrawn( | 2461 void RenderWidgetHostImpl::OnGpuSwapBuffersCompleted( |
| 2461 const std::vector<ui::LatencyInfo>& latency_info) { | 2462 const std::vector<ui::LatencyInfo>& latency_info) { |
| 2462 for (size_t i = 0; i < latency_info.size(); i++) { | 2463 for (size_t i = 0; i < latency_info.size(); i++) { |
| 2463 std::set<RenderWidgetHostImpl*> rwhi_set; | 2464 std::set<RenderWidgetHostImpl*> rwhi_set; |
| 2464 for (const auto& lc : latency_info[i].latency_components()) { | 2465 for (const auto& lc : latency_info[i].latency_components()) { |
| 2465 if (lc.first.first == ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT || | 2466 if (lc.first.first == ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT || |
| 2466 lc.first.first == ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT || | 2467 lc.first.first == ui::BROWSER_SNAPSHOT_FRAME_NUMBER_COMPONENT || |
| 2467 lc.first.first == ui::TAB_SHOW_COMPONENT) { | 2468 lc.first.first == ui::TAB_SHOW_COMPONENT) { |
| 2468 // Matches with GetLatencyComponentId | 2469 // Matches with GetLatencyComponentId |
| 2469 int routing_id = lc.first.second & 0xffffffff; | 2470 int routing_id = lc.first.second & 0xffffffff; |
| 2470 int process_id = (lc.first.second >> 32) & 0xffffffff; | 2471 int process_id = (lc.first.second >> 32) & 0xffffffff; |
| 2471 RenderWidgetHost* rwh = | 2472 RenderWidgetHost* rwh = |
| 2472 RenderWidgetHost::FromID(process_id, routing_id); | 2473 RenderWidgetHost::FromID(process_id, routing_id); |
| 2473 if (!rwh) { | 2474 if (!rwh) { |
| 2474 continue; | 2475 continue; |
| 2475 } | 2476 } |
| 2476 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rwh); | 2477 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rwh); |
| 2477 if (rwhi_set.insert(rwhi).second) | 2478 if (rwhi_set.insert(rwhi).second) |
| 2478 rwhi->FrameSwapped(latency_info[i]); | 2479 rwhi->OnGpuSwapBuffersCompletedInternal(latency_info[i]); |
| 2479 } | 2480 } |
| 2480 } | 2481 } |
| 2481 } | 2482 } |
| 2482 } | 2483 } |
| 2483 | 2484 |
| 2484 BrowserAccessibilityManager* | 2485 BrowserAccessibilityManager* |
| 2485 RenderWidgetHostImpl::GetRootBrowserAccessibilityManager() { | 2486 RenderWidgetHostImpl::GetRootBrowserAccessibilityManager() { |
| 2486 return delegate_ ? delegate_->GetRootBrowserAccessibilityManager() : NULL; | 2487 return delegate_ ? delegate_->GetRootBrowserAccessibilityManager() : NULL; |
| 2487 } | 2488 } |
| 2488 | 2489 |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2655 | 2656 |
| 2656 // After navigation, if a frame belonging to the new page is received, stop | 2657 // After navigation, if a frame belonging to the new page is received, stop |
| 2657 // the timer that triggers clearing the graphics of the last page. | 2658 // the timer that triggers clearing the graphics of the last page. |
| 2658 if (last_received_content_source_id_ >= current_content_source_id_ && | 2659 if (last_received_content_source_id_ >= current_content_source_id_ && |
| 2659 new_content_rendering_timeout_->IsRunning()) { | 2660 new_content_rendering_timeout_->IsRunning()) { |
| 2660 new_content_rendering_timeout_->Stop(); | 2661 new_content_rendering_timeout_->Stop(); |
| 2661 } | 2662 } |
| 2662 } | 2663 } |
| 2663 | 2664 |
| 2664 } // namespace content | 2665 } // namespace content |
| OLD | NEW |