| 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 740c0a2bf3d7150c57eed70a7ede306d52ad8bf5..f7ec85bdfcf5656d0333a85243abb6658c9d6b7d 100644
|
| --- a/content/browser/devtools/protocol/page_handler.cc
|
| +++ b/content/browser/devtools/protocol/page_handler.cc
|
| @@ -9,8 +9,6 @@
|
| #include "base/base64.h"
|
| #include "base/bind.h"
|
| #include "base/location.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/memory/ref_counted_memory.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/strings/string16.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| @@ -39,8 +37,6 @@
|
| #include "ui/gfx/codec/jpeg_codec.h"
|
| #include "ui/gfx/codec/png_codec.h"
|
| #include "ui/gfx/geometry/size_conversions.h"
|
| -#include "ui/gfx/image/image.h"
|
| -#include "ui/gfx/image/image_util.h"
|
| #include "ui/snapshot/snapshot.h"
|
| #include "url/gurl.h"
|
|
|
| @@ -56,27 +52,37 @@
|
| static int kCaptureRetryLimit = 2;
|
| static int kMaxScreencastFramesInFlight = 2;
|
|
|
| -std::string EncodeImage(const gfx::Image& image,
|
| - const std::string& format,
|
| - int quality) {
|
| - DCHECK(!image.IsEmpty());
|
| -
|
| - scoped_refptr<base::RefCountedMemory> data;
|
| +std::string EncodeScreencastFrame(const SkBitmap& bitmap,
|
| + const std::string& format,
|
| + int quality) {
|
| + std::vector<unsigned char> data;
|
| + SkAutoLockPixels lock_image(bitmap);
|
| + bool encoded;
|
| if (format == kPng) {
|
| - data = image.As1xPNGBytes();
|
| + encoded = gfx::PNGCodec::Encode(
|
| + reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0)),
|
| + gfx::PNGCodec::FORMAT_SkBitmap,
|
| + gfx::Size(bitmap.width(), bitmap.height()),
|
| + bitmap.width() * bitmap.bytesPerPixel(),
|
| + false, std::vector<gfx::PNGCodec::Comment>(), &data);
|
| } else if (format == kJpeg) {
|
| - scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes());
|
| - if (gfx::JPEG1xEncodedDataFromImage(image, quality, &bytes->data()))
|
| - data = bytes;
|
| - }
|
| -
|
| - if (!data || !data->front())
|
| + encoded = gfx::JPEGCodec::Encode(
|
| + reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0)),
|
| + gfx::JPEGCodec::FORMAT_SkBitmap,
|
| + bitmap.width(),
|
| + bitmap.height(),
|
| + bitmap.width() * bitmap.bytesPerPixel(),
|
| + quality, &data);
|
| + } else {
|
| + encoded = false;
|
| + }
|
| +
|
| + if (!encoded)
|
| return std::string();
|
|
|
| std::string base_64_data;
|
| base::Base64Encode(
|
| - base::StringPiece(reinterpret_cast<const char*>(data->front()),
|
| - data->size()),
|
| + base::StringPiece(reinterpret_cast<char*>(&data[0]), data.size()),
|
| &base_64_data);
|
|
|
| return base_64_data;
|
| @@ -279,21 +285,15 @@
|
| }
|
|
|
| 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)), screenshot_format,
|
| - screenshot_quality));
|
| + base::Bind(&PageHandler::ScreenshotCaptured,
|
| + weak_factory_.GetWeakPtr(), base::Passed(std::move(callback))));
|
| }
|
|
|
| Response PageHandler::StartScreencast(Maybe<std::string> format,
|
| @@ -519,8 +519,8 @@
|
| base::PostTaskWithTraitsAndReplyWithResult(
|
| FROM_HERE, base::TaskTraits().WithShutdownBehavior(
|
| base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
|
| - base::Bind(&EncodeImage, gfx::Image::CreateFrom1xBitmap(bitmap),
|
| - screencast_format_, screencast_quality_),
|
| + base::Bind(&EncodeScreencastFrame, bitmap, screencast_format_,
|
| + screencast_quality_),
|
| base::Bind(&PageHandler::ScreencastFrameEncoded,
|
| weak_factory_.GetWeakPtr(), base::Passed(&metadata),
|
| base::Time::Now()));
|
| @@ -561,15 +561,18 @@
|
|
|
| void PageHandler::ScreenshotCaptured(
|
| std::unique_ptr<CaptureScreenshotCallback> callback,
|
| - const std::string& format,
|
| - int quality,
|
| - const gfx::Image& image) {
|
| - if (image.IsEmpty()) {
|
| + const unsigned char* png_data,
|
| + size_t png_size) {
|
| + if (!png_data || !png_size) {
|
| callback->sendFailure(Response::Error("Unable to capture screenshot"));
|
| return;
|
| }
|
|
|
| - callback->sendSuccess(EncodeImage(image, format, quality));
|
| + 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);
|
| }
|
|
|
| void PageHandler::OnColorPicked(int r, int g, int b, int a) {
|
|
|