Index: chrome/browser/thumbnails/render_widget_snapshot_taker.cc |
diff --git a/chrome/browser/thumbnails/render_widget_snapshot_taker.cc b/chrome/browser/thumbnails/render_widget_snapshot_taker.cc |
deleted file mode 100644 |
index f9e22632b3e103d612cb8ac6a62540c98dc0e397..0000000000000000000000000000000000000000 |
--- a/chrome/browser/thumbnails/render_widget_snapshot_taker.cc |
+++ /dev/null |
@@ -1,195 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/thumbnails/render_widget_snapshot_taker.h" |
- |
-#include "base/bind.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "content/public/browser/notification_details.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/browser/notification_types.h" |
-#include "content/public/browser/render_process_host.h" |
-#include "content/public/browser/render_view_host.h" |
-#include "content/public/browser/render_widget_host_view.h" |
-#include "ui/base/layout.h" |
-#include "ui/gfx/size.h" |
-#include "ui/gfx/size_conversions.h" |
-#include "ui/surface/transport_dib.h" |
- |
-using content::RenderWidgetHost; |
- |
-struct RenderWidgetSnapshotTaker::AsyncRequestInfo { |
- SnapshotReadyCallback callback; |
- scoped_ptr<TransportDIB> thumbnail_dib; |
- RenderWidgetHost* renderer; // Not owned. |
-}; |
- |
-RenderWidgetSnapshotTaker::RenderWidgetSnapshotTaker() { |
- // The BrowserProcessImpl creates this non-lazily. If you add nontrivial |
- // stuff here, be sure to convert it to being lazily created. |
- // |
- // We don't register for notifications here since BrowserProcessImpl creates |
- // us before the NotificationService is. |
-} |
- |
-RenderWidgetSnapshotTaker::~RenderWidgetSnapshotTaker() { |
-} |
- |
-void RenderWidgetSnapshotTaker::AskForSnapshot( |
- RenderWidgetHost* renderer, |
- const SnapshotReadyCallback& callback, |
- gfx::Size page_size, |
- gfx::Size desired_size) { |
- // We are going to render the thumbnail asynchronously now, so keep |
- // this callback for later lookup when the rendering is done. |
- static int sequence_num = 0; |
- sequence_num++; |
- float scale_factor = ui::GetImageScale(ui::GetScaleFactorForNativeView( |
- renderer->GetView()->GetNativeView())); |
- gfx::Size desired_size_in_pixel = gfx::ToFlooredSize( |
- gfx::ScaleSize(desired_size, scale_factor)); |
- scoped_ptr<TransportDIB> thumbnail_dib(TransportDIB::Create( |
- desired_size_in_pixel.GetArea() * 4, sequence_num)); |
- |
-#if defined(OS_LINUX) |
- // TODO: IPC a handle to the renderer like Windows. |
- // http://code.google.com/p/chromium/issues/detail?id=89777 |
- NOTIMPLEMENTED(); |
- return; |
-#else |
- |
-#if defined(OS_WIN) |
- // Duplicate the handle to the DIB here because the renderer process does not |
- // have permission. The duplicated handle is owned by the renderer process, |
- // which is responsible for closing it. |
- TransportDIB::Handle renderer_dib_handle; |
- DuplicateHandle(GetCurrentProcess(), thumbnail_dib->handle(), |
- renderer->GetProcess()->GetHandle(), &renderer_dib_handle, |
- STANDARD_RIGHTS_REQUIRED | FILE_MAP_READ | FILE_MAP_WRITE, |
- FALSE, 0); |
- if (!renderer_dib_handle) { |
- LOG(WARNING) << "Could not duplicate dib handle for renderer"; |
- return; |
- } |
-#else |
- TransportDIB::Handle renderer_dib_handle = thumbnail_dib->handle(); |
-#endif |
- |
- linked_ptr<AsyncRequestInfo> request_info(new AsyncRequestInfo); |
- request_info->callback = callback; |
- request_info->thumbnail_dib.reset(thumbnail_dib.release()); |
- request_info->renderer = renderer; |
- SnapshotCallbackMap::value_type new_value(sequence_num, request_info); |
- std::pair<SnapshotCallbackMap::iterator, bool> result = |
- callback_map_.insert(new_value); |
- if (!result.second) { |
- NOTREACHED() << "Callback already registered?"; |
- return; |
- } |
- |
- MonitorRenderer(renderer, true); |
- renderer->PaintAtSize( |
- renderer_dib_handle, sequence_num, page_size, desired_size); |
- |
-#endif // defined(USE_X11) |
-} |
- |
-void RenderWidgetSnapshotTaker::CancelSnapshot( |
- content::RenderWidgetHost* renderer) { |
- SnapshotCallbackMap::iterator iterator = callback_map_.begin(); |
- while (iterator != callback_map_.end()) { |
- if (iterator->second->renderer == renderer) { |
- SnapshotCallbackMap::iterator nuked = iterator; |
- ++iterator; |
- callback_map_.erase(nuked); |
- MonitorRenderer(renderer, false); |
- continue; |
- } |
- ++iterator; |
- } |
-} |
- |
-void RenderWidgetSnapshotTaker::WidgetDidReceivePaintAtSizeAck( |
- RenderWidgetHost* widget, |
- int sequence_num, |
- const gfx::Size& size) { |
- // Lookup the callback, run it, and erase it. |
- SnapshotCallbackMap::iterator item = callback_map_.find(sequence_num); |
- if (item != callback_map_.end()) { |
- DCHECK_EQ(widget, item->second->renderer); |
- TransportDIB* dib = item->second->thumbnail_dib.get(); |
- DCHECK(dib); |
- if (!dib || !dib->Map()) { |
- return; |
- } |
- |
- // Create an SkBitmap from the DIB. |
- SkBitmap non_owned_bitmap; |
- SkBitmap result; |
- |
- // Fill out the non_owned_bitmap with the right config. Note that |
- // this code assumes that the transport dib is a 32-bit ARGB |
- // image. |
- non_owned_bitmap.setConfig(SkBitmap::kARGB_8888_Config, |
- size.width(), size.height()); |
- if (dib->size() < non_owned_bitmap.getSafeSize()) |
- return; |
- non_owned_bitmap.setPixels(dib->memory()); |
- |
- // Now alloc/copy the memory so we own it and can pass it around, |
- // and the memory won't go away when the DIB goes away. |
- // TODO: Figure out a way to avoid this copy? |
- non_owned_bitmap.copyTo(&result, SkBitmap::kARGB_8888_Config); |
- |
- item->second->callback.Run(result); |
- |
- // We're done with the callback, and with the DIB, so delete both. |
- callback_map_.erase(item); |
- MonitorRenderer(widget, false); |
- } |
-} |
- |
-void RenderWidgetSnapshotTaker::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- switch (type) { |
- case content::NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_PAINT_AT_SIZE_ACK: { |
- std::pair<int, gfx::Size>* size_ack_details = |
- content::Details<std::pair<int, gfx::Size> >(details).ptr(); |
- WidgetDidReceivePaintAtSizeAck( |
- content::Source<RenderWidgetHost>(source).ptr(), |
- size_ack_details->first, |
- size_ack_details->second); |
- break; |
- } |
- |
- default: |
- NOTREACHED() << "Unexpected notification type: " << type; |
- } |
-} |
- |
-void RenderWidgetSnapshotTaker::MonitorRenderer(RenderWidgetHost* renderer, |
- bool monitor) { |
- content::Source<RenderWidgetHost> renderer_source = |
- content::Source<RenderWidgetHost>(renderer); |
- if (monitor) { |
- int new_count = ++host_monitor_counts_[renderer]; |
- if (new_count == 1) { |
- registrar_.Add( |
- this, |
- content::NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_PAINT_AT_SIZE_ACK, |
- renderer_source); |
- } |
- } else { |
- int new_count = --host_monitor_counts_[renderer]; |
- if (new_count == 0) { |
- host_monitor_counts_.erase(renderer); |
- registrar_.Remove( |
- this, |
- content::NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_PAINT_AT_SIZE_ACK, |
- renderer_source); |
- } |
- } |
-} |