| 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 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/auto_reset.h" | 11 #include "base/auto_reset.h" |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/containers/hash_tables.h" | 14 #include "base/containers/hash_tables.h" |
| 15 #include "base/debug/trace_event.h" | 15 #include "base/debug/trace_event.h" |
| 16 #include "base/i18n/rtl.h" | 16 #include "base/i18n/rtl.h" |
| 17 #include "base/lazy_instance.h" | 17 #include "base/lazy_instance.h" |
| 18 #include "base/message_loop/message_loop.h" | 18 #include "base/message_loop/message_loop.h" |
| 19 #include "base/metrics/field_trial.h" | 19 #include "base/metrics/field_trial.h" |
| 20 #include "base/metrics/histogram.h" | 20 #include "base/metrics/histogram.h" |
| 21 #include "base/strings/string_number_conversions.h" | 21 #include "base/strings/string_number_conversions.h" |
| 22 #include "base/strings/utf_string_conversions.h" | 22 #include "base/strings/utf_string_conversions.h" |
| 23 #include "base/thread_task_runner_handle.h" |
| 23 #include "cc/output/compositor_frame.h" | 24 #include "cc/output/compositor_frame.h" |
| 24 #include "cc/output/compositor_frame_ack.h" | 25 #include "cc/output/compositor_frame_ack.h" |
| 25 #include "content/browser/accessibility/browser_accessibility_state_impl.h" | 26 #include "content/browser/accessibility/browser_accessibility_state_impl.h" |
| 26 #include "content/browser/gpu/compositor_util.h" | 27 #include "content/browser/gpu/compositor_util.h" |
| 27 #include "content/browser/gpu/gpu_process_host.h" | 28 #include "content/browser/gpu/gpu_process_host.h" |
| 28 #include "content/browser/gpu/gpu_process_host_ui_shim.h" | 29 #include "content/browser/gpu/gpu_process_host_ui_shim.h" |
| 29 #include "content/browser/gpu/gpu_surface_tracker.h" | 30 #include "content/browser/gpu/gpu_surface_tracker.h" |
| 30 #include "content/browser/renderer_host/backing_store.h" | 31 #include "content/browser/renderer_host/backing_store.h" |
| 31 #include "content/browser/renderer_host/backing_store_manager.h" | 32 #include "content/browser/renderer_host/backing_store_manager.h" |
| 32 #include "content/browser/renderer_host/dip_util.h" | 33 #include "content/browser/renderer_host/dip_util.h" |
| (...skipping 2383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2416 | 2417 |
| 2417 if (CommandLine::ForCurrentProcess()->HasSwitch( | 2418 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 2418 switches::kEnableGpuBenchmarking)) | 2419 switches::kEnableGpuBenchmarking)) |
| 2419 Send(new ViewMsg_SetBrowserRenderingStats(routing_id_, rendering_stats_)); | 2420 Send(new ViewMsg_SetBrowserRenderingStats(routing_id_, rendering_stats_)); |
| 2420 } | 2421 } |
| 2421 | 2422 |
| 2422 void RenderWidgetHostImpl::DidReceiveRendererFrame() { | 2423 void RenderWidgetHostImpl::DidReceiveRendererFrame() { |
| 2423 view_->DidReceiveRendererFrame(); | 2424 view_->DidReceiveRendererFrame(); |
| 2424 } | 2425 } |
| 2425 | 2426 |
| 2427 void RenderWidgetHostImpl::WindowSnapshotAsyncCallback( |
| 2428 int routing_id, |
| 2429 int snapshot_id, |
| 2430 gfx::Size snapshot_size, |
| 2431 scoped_refptr<base::RefCountedBytes> png_data) { |
| 2432 if (!png_data) { |
| 2433 std::vector<unsigned char> png_vector; |
| 2434 Send(new ViewMsg_WindowSnapshotCompleted( |
| 2435 routing_id, snapshot_id, gfx::Size(), png_vector)); |
| 2436 return; |
| 2437 } |
| 2438 |
| 2439 Send(new ViewMsg_WindowSnapshotCompleted( |
| 2440 routing_id, snapshot_id, snapshot_size, png_data->data())); |
| 2441 } |
| 2442 |
| 2426 void RenderWidgetHostImpl::WindowSnapshotReachedScreen(int snapshot_id) { | 2443 void RenderWidgetHostImpl::WindowSnapshotReachedScreen(int snapshot_id) { |
| 2427 DCHECK(base::MessageLoop::current()->IsType(base::MessageLoop::TYPE_UI)); | 2444 DCHECK(base::MessageLoop::current()->IsType(base::MessageLoop::TYPE_UI)); |
| 2428 | 2445 |
| 2429 std::vector<unsigned char> png; | 2446 std::vector<unsigned char> png; |
| 2430 | 2447 |
| 2431 // This feature is behind the kEnableGpuBenchmarking command line switch | 2448 // This feature is behind the kEnableGpuBenchmarking command line switch |
| 2432 // because it poses security concerns and should only be used for testing. | 2449 // because it poses security concerns and should only be used for testing. |
| 2433 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 2450 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
| 2434 if (command_line.HasSwitch(switches::kEnableGpuBenchmarking)) { | 2451 if (!command_line.HasSwitch(switches::kEnableGpuBenchmarking)) { |
| 2435 gfx::Rect view_bounds = GetView()->GetViewBounds(); | 2452 Send(new ViewMsg_WindowSnapshotCompleted( |
| 2436 gfx::Rect snapshot_bounds(view_bounds.size()); | 2453 GetRoutingID(), snapshot_id, gfx::Size(), png)); |
| 2437 gfx::Size snapshot_size = snapshot_bounds.size(); | 2454 return; |
| 2438 | |
| 2439 if (ui::GrabViewSnapshot(GetView()->GetNativeView(), | |
| 2440 &png, snapshot_bounds)) { | |
| 2441 Send(new ViewMsg_WindowSnapshotCompleted( | |
| 2442 GetRoutingID(), snapshot_id, snapshot_size, png)); | |
| 2443 return; | |
| 2444 } | |
| 2445 } | 2455 } |
| 2446 | 2456 |
| 2447 Send(new ViewMsg_WindowSnapshotCompleted( | 2457 gfx::Rect view_bounds = GetView()->GetViewBounds(); |
| 2448 GetRoutingID(), snapshot_id, gfx::Size(), png)); | 2458 gfx::Rect snapshot_bounds(view_bounds.size()); |
| 2459 gfx::Size snapshot_size = snapshot_bounds.size(); |
| 2460 |
| 2461 if (ui::GrabViewSnapshot( |
| 2462 GetView()->GetNativeView(), &png, snapshot_bounds)) { |
| 2463 Send(new ViewMsg_WindowSnapshotCompleted( |
| 2464 GetRoutingID(), snapshot_id, snapshot_size, png)); |
| 2465 return; |
| 2466 } |
| 2467 |
| 2468 ui::GrabViewSnapshotAsync( |
| 2469 GetView()->GetNativeView(), |
| 2470 snapshot_bounds, |
| 2471 base::ThreadTaskRunnerHandle::Get(), |
| 2472 base::Bind(&RenderWidgetHostImpl::WindowSnapshotAsyncCallback, |
| 2473 weak_factory_.GetWeakPtr(), |
| 2474 GetRoutingID(), |
| 2475 snapshot_id, |
| 2476 snapshot_size)); |
| 2449 } | 2477 } |
| 2450 | 2478 |
| 2451 // static | 2479 // static |
| 2452 void RenderWidgetHostImpl::CompositorFrameDrawn( | 2480 void RenderWidgetHostImpl::CompositorFrameDrawn( |
| 2453 const ui::LatencyInfo& latency_info) { | 2481 const ui::LatencyInfo& latency_info) { |
| 2454 std::set<RenderWidgetHostImpl*> rwhi_set; | 2482 std::set<RenderWidgetHostImpl*> rwhi_set; |
| 2455 | 2483 |
| 2456 for (ui::LatencyInfo::LatencyMap::const_iterator b = | 2484 for (ui::LatencyInfo::LatencyMap::const_iterator b = |
| 2457 latency_info.latency_components.begin(); | 2485 latency_info.latency_components.begin(); |
| 2458 b != latency_info.latency_components.end(); | 2486 b != latency_info.latency_components.end(); |
| 2459 ++b) { | 2487 ++b) { |
| 2460 if (b->first.first == ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT || | 2488 if (b->first.first == ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT || |
| 2461 b->first.first == ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT) { | 2489 b->first.first == ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT) { |
| 2462 // Matches with GetLatencyComponentId | 2490 // Matches with GetLatencyComponentId |
| 2463 int routing_id = b->first.second & 0xffffffff; | 2491 int routing_id = b->first.second & 0xffffffff; |
| 2464 int process_id = (b->first.second >> 32) & 0xffffffff; | 2492 int process_id = (b->first.second >> 32) & 0xffffffff; |
| 2465 RenderWidgetHost* rwh = | 2493 RenderWidgetHost* rwh = |
| 2466 RenderWidgetHost::FromID(process_id, routing_id); | 2494 RenderWidgetHost::FromID(process_id, routing_id); |
| 2467 if (!rwh) { | 2495 if (!rwh) { |
| 2468 continue; | 2496 continue; |
| 2469 } | 2497 } |
| 2470 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rwh); | 2498 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rwh); |
| 2471 if (rwhi_set.insert(rwhi).second) | 2499 if (rwhi_set.insert(rwhi).second) |
| 2472 rwhi->FrameSwapped(latency_info); | 2500 rwhi->FrameSwapped(latency_info); |
| 2473 } | 2501 } |
| 2474 } | 2502 } |
| 2475 } | 2503 } |
| 2476 | 2504 |
| 2477 } // namespace content | 2505 } // namespace content |
| OLD | NEW |