Index: content/browser/devtools/protocol/page_handler.cc |
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc |
index 99e6ad202a1efb4789b6456a895c77c7e91c8cf4..f3f31fa3f47e31343fc97ef643923f836c464c88 100644 |
--- a/content/browser/devtools/protocol/page_handler.cc |
+++ b/content/browser/devtools/protocol/page_handler.cc |
@@ -51,9 +51,9 @@ static int kFrameRetryDelayMs = 100; |
static int kCaptureRetryLimit = 2; |
static int kMaxScreencastFramesInFlight = 2; |
-std::string EncodeScreencastFrame(const SkBitmap& bitmap, |
- const std::string& format, |
- int quality) { |
+std::string EncodeBitmap(const SkBitmap& bitmap, |
+ const std::string& format, |
+ int quality) { |
std::vector<unsigned char> data; |
SkAutoLockPixels lock_image(bitmap); |
bool encoded; |
@@ -277,15 +277,21 @@ Response PageHandler::NavigateToHistoryEntry(int entry_id) { |
} |
void PageHandler::CaptureScreenshot( |
+ Maybe<std::string> format, |
+ Maybe<int> quality, |
std::unique_ptr<CaptureScreenshotCallback> callback) { |
if (!host_ || !host_->GetRenderWidgetHost()) { |
callback->sendFailure(Response::InternalError()); |
return; |
} |
+ std::string screenshot_format = format.fromMaybe(kPng); |
+ int screenshot_quality = quality.fromMaybe(kDefaultScreenshotQuality); |
+ |
host_->GetRenderWidgetHost()->GetSnapshotFromBrowser( |
- base::Bind(&PageHandler::ScreenshotCaptured, |
- weak_factory_.GetWeakPtr(), base::Passed(std::move(callback)))); |
+ base::Bind(&PageHandler::ScreenshotCaptured, weak_factory_.GetWeakPtr(), |
+ base::Passed(std::move(callback)), screenshot_format, |
+ screenshot_quality)); |
} |
Response PageHandler::StartScreencast(Maybe<std::string> format, |
@@ -510,7 +516,7 @@ void PageHandler::ScreencastFrameCaptured(cc::CompositorFrameMetadata metadata, |
} |
base::PostTaskAndReplyWithResult( |
base::WorkerPool::GetTaskRunner(true).get(), FROM_HERE, |
- base::Bind(&EncodeScreencastFrame, bitmap, screencast_format_, |
+ base::Bind(&EncodeBitmap, bitmap, screencast_format_, |
screencast_quality_), |
base::Bind(&PageHandler::ScreencastFrameEncoded, |
weak_factory_.GetWeakPtr(), base::Passed(&metadata), |
@@ -552,18 +558,25 @@ void PageHandler::ScreencastFrameEncoded(cc::CompositorFrameMetadata metadata, |
void PageHandler::ScreenshotCaptured( |
std::unique_ptr<CaptureScreenshotCallback> callback, |
- const unsigned char* png_data, |
- size_t png_size) { |
- if (!png_data || !png_size) { |
+ const std::string& format, |
+ int quality, |
+ const SkBitmap& bitmap) { |
+ if (bitmap.drawsNothing()) { |
callback->sendFailure(Response::Error("Unable to capture screenshot")); |
return; |
} |
- std::string base_64_data; |
- base::Base64Encode( |
- base::StringPiece(reinterpret_cast<const char*>(png_data), png_size), |
- &base_64_data); |
- callback->sendSuccess(base_64_data); |
+ base::PostTaskAndReplyWithResult( |
+ base::WorkerPool::GetTaskRunner(true).get(), FROM_HERE, |
+ base::Bind(&EncodeBitmap, bitmap, format, quality), |
+ base::Bind(&PageHandler::ScreenshotEncoded, weak_factory_.GetWeakPtr(), |
+ base::Passed(std::move(callback)))); |
+} |
+ |
+void PageHandler::ScreenshotEncoded( |
+ std::unique_ptr<CaptureScreenshotCallback> callback, |
+ const std::string& data) { |
+ callback->sendSuccess(data); |
} |
void PageHandler::OnColorPicked(int r, int g, int b, int a) { |