Index: content/browser/devtools/renderer_overrides_handler.cc |
diff --git a/content/browser/devtools/renderer_overrides_handler.cc b/content/browser/devtools/renderer_overrides_handler.cc |
index 0f906152dab2d609ac01db099107d7438b27b791..c40e3839281c2a9ce253f1dbb45ad7591a7fbc6f 100644 |
--- a/content/browser/devtools/renderer_overrides_handler.cc |
+++ b/content/browser/devtools/renderer_overrides_handler.cc |
@@ -201,10 +201,9 @@ void RendererOverridesHandler::InnerSwapCompositorFrame() { |
view_port->CopyFromCompositingSurface( |
view_bounds, snapshot_size, |
- base::Bind(&RendererOverridesHandler::ScreenshotCaptured, |
+ base::Bind(&RendererOverridesHandler::ScreencastFrameCaptured, |
weak_factory_.GetWeakPtr(), |
- scoped_refptr<DevToolsProtocol::Command>(), format, quality, |
- last_compositor_frame_metadata_), |
+ format, quality, last_compositor_frame_metadata_), |
SkBitmap::kARGB_8888_Config); |
} |
@@ -219,13 +218,13 @@ void RendererOverridesHandler::ParseCaptureParameters( |
double max_height = -1; |
base::DictionaryValue* params = command->params(); |
if (params) { |
- params->GetString(devtools::Page::captureScreenshot::kParamFormat, |
+ params->GetString(devtools::Page::startScreencast::kParamFormat, |
format); |
- params->GetInteger(devtools::Page::captureScreenshot::kParamQuality, |
+ params->GetInteger(devtools::Page::startScreencast::kParamQuality, |
quality); |
- params->GetDouble(devtools::Page::captureScreenshot::kParamMaxWidth, |
+ params->GetDouble(devtools::Page::startScreencast::kParamMaxWidth, |
&max_width); |
- params->GetDouble(devtools::Page::captureScreenshot::kParamMaxHeight, |
+ params->GetDouble(devtools::Page::startScreencast::kParamMaxHeight, |
&max_height); |
} |
@@ -423,47 +422,38 @@ RendererOverridesHandler::PageNavigateToHistoryEntry( |
scoped_refptr<DevToolsProtocol::Response> |
RendererOverridesHandler::PageCaptureScreenshot( |
scoped_refptr<DevToolsProtocol::Command> command) { |
- RenderViewHost* host = agent_->GetRenderViewHost(); |
+ RenderViewHostImpl* host = static_cast<RenderViewHostImpl*>( |
+ agent_->GetRenderViewHost()); |
if (!host->GetView()) |
return command->InternalErrorResponse("Unable to access the view"); |
- std::string format; |
- int quality = kDefaultScreenshotQuality; |
- double scale = 1; |
- ParseCaptureParameters(command.get(), &format, &quality, &scale); |
+ host->RequestWindowSnapshot( |
+ base::Bind(&RendererOverridesHandler::ScreenshotCaptured, |
+ weak_factory_.GetWeakPtr(), command)); |
- gfx::Rect view_bounds = host->GetView()->GetViewBounds(); |
- gfx::Size snapshot_size = gfx::ToFlooredSize( |
- gfx::ScaleSize(view_bounds.size(), scale)); |
+ return command->AsyncResponsePromise(); |
+} |
- // Grab screen pixels if available for current platform. |
- // TODO(pfeldman): support format, scale and quality in ui::GrabViewSnapshot. |
- std::vector<unsigned char> png; |
- bool is_unscaled_png = scale == 1 && format == kPng; |
- if (is_unscaled_png && ui::GrabViewSnapshot(host->GetView()->GetNativeView(), |
- &png, |
- gfx::Rect(snapshot_size))) { |
- std::string base64_data; |
- base::Base64Encode( |
- base::StringPiece(reinterpret_cast<char*>(&*png.begin()), png.size()), |
- &base64_data); |
- base::DictionaryValue* result = new base::DictionaryValue(); |
- result->SetString( |
- devtools::Page::captureScreenshot::kResponseData, base64_data); |
- return command->SuccessResponse(result); |
+void RendererOverridesHandler::ScreenshotCaptured( |
+ scoped_refptr<DevToolsProtocol::Command> command, |
+ const unsigned char* png_data, |
+ size_t png_size) { |
+ if (!png_data || !png_size) { |
+ SendAsyncResponse( |
+ command->InternalErrorResponse("Unable to capture screenshot")); |
+ return; |
} |
- // Fallback to copying from compositing surface. |
- RenderWidgetHostViewPort* view_port = |
- RenderWidgetHostViewPort::FromRWHV(host->GetView()); |
+ std::string base_64_data; |
+ base::Base64Encode( |
+ base::StringPiece(reinterpret_cast<const char*>(png_data), png_size), |
+ &base_64_data); |
- view_port->CopyFromCompositingSurface( |
- view_bounds, snapshot_size, |
- base::Bind(&RendererOverridesHandler::ScreenshotCaptured, |
- weak_factory_.GetWeakPtr(), command, format, quality, |
- last_compositor_frame_metadata_), |
- SkBitmap::kARGB_8888_Config); |
- return command->AsyncResponsePromise(); |
+ base::DictionaryValue* response = new base::DictionaryValue(); |
+ response->SetString(devtools::Page::screencastFrame::kParamData, |
+ base_64_data); |
+ |
+ SendAsyncResponse(command->SuccessResponse(response)); |
} |
scoped_refptr<DevToolsProtocol::Response> |
@@ -499,18 +489,14 @@ RendererOverridesHandler::PageStopScreencast( |
return command->SuccessResponse(NULL); |
} |
-void RendererOverridesHandler::ScreenshotCaptured( |
- scoped_refptr<DevToolsProtocol::Command> command, |
+void RendererOverridesHandler::ScreencastFrameCaptured( |
const std::string& format, |
int quality, |
const cc::CompositorFrameMetadata& metadata, |
bool success, |
const SkBitmap& bitmap) { |
if (!success) { |
- if (command) { |
- SendAsyncResponse( |
- command->InternalErrorResponse("Unable to capture screenshot")); |
- } else if (capture_retry_count_) { |
+ if (capture_retry_count_) { |
--capture_retry_count_; |
base::MessageLoop::current()->PostDelayedTask( |
FROM_HERE, |
@@ -543,13 +529,8 @@ void RendererOverridesHandler::ScreenshotCaptured( |
encoded = false; |
} |
- if (!encoded) { |
- if (command) { |
- SendAsyncResponse( |
- command->InternalErrorResponse("Unable to encode screenshot")); |
- } |
+ if (!encoded) |
return; |
- } |
std::string base_64_data; |
base::Base64Encode( |
@@ -595,20 +576,11 @@ void RendererOverridesHandler::ScreenshotCaptured( |
response_metadata->Set( |
devtools::Page::ScreencastFrameMetadata::kParamViewport, viewport); |
- if (command) { |
- response->Set(devtools::Page::captureScreenshot::kResponseMetadata, |
- response_metadata); |
- } else { |
- response->Set(devtools::Page::screencastFrame::kParamMetadata, |
- response_metadata); |
- } |
+ response->Set(devtools::Page::screencastFrame::kParamMetadata, |
+ response_metadata); |
} |
- if (command) { |
- SendAsyncResponse(command->SuccessResponse(response)); |
- } else { |
- SendNotification(devtools::Page::screencastFrame::kName, response); |
- } |
+ SendNotification(devtools::Page::screencastFrame::kName, response); |
} |
// Quota and Usage ------------------------------------------ |