| Index: chrome/browser/extensions/extension_tabs_module.cc
|
| diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc
|
| index 28b50e9b83e8af8c335d2feab482b2086a6e040b..ae275e987878142e91b8a74e7ae4a6e3c2d54747 100644
|
| --- a/chrome/browser/extensions/extension_tabs_module.cc
|
| +++ b/chrome/browser/extensions/extension_tabs_module.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2010 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.
|
|
|
| @@ -25,12 +25,15 @@
|
| #include "chrome/common/extensions/extension_error_utils.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "gfx/codec/jpeg_codec.h"
|
| +#include "gfx/codec/png_codec.h"
|
| #include "skia/ext/image_operations.h"
|
| #include "skia/ext/platform_canvas.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
|
|
| namespace keys = extension_tabs_module_constants;
|
|
|
| +const int CaptureVisibleTabFunction::kDefaultQuality = 90;
|
| +
|
| // Forward declare static helper functions defined below.
|
|
|
| // |error_message| can optionally be passed in a will be set with an appropriate
|
| @@ -805,8 +808,11 @@ bool CaptureVisibleTabFunction::RunImpl() {
|
| // windowId defaults to "current" window.
|
| int window_id = -1;
|
|
|
| - if (!args_->IsType(Value::TYPE_NULL)) {
|
| - EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&window_id));
|
| + EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST));
|
| + const ListValue* args = args_as_list();
|
| +
|
| + if (HasOptionalArgument(0)) {
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetInteger(0, &window_id));
|
| browser = GetBrowserInProfileWithId(profile(), window_id,
|
| include_incognito(), &error_);
|
| } else {
|
| @@ -818,6 +824,34 @@ bool CaptureVisibleTabFunction::RunImpl() {
|
| return false;
|
| }
|
|
|
| + image_format_ = FORMAT_JPEG; // Default format is JPEG.
|
| + image_quality_ = kDefaultQuality; // Default quality setting.
|
| +
|
| + if (HasOptionalArgument(1)) {
|
| + DictionaryValue* options;
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetDictionary(1, &options));
|
| +
|
| + if (options->HasKey(keys::kFormatKey)) {
|
| + std::string format;
|
| + EXTENSION_FUNCTION_VALIDATE(
|
| + options->GetString(keys::kFormatKey, &format));
|
| +
|
| + if (format == keys::kFormatValueJpeg) {
|
| + image_format_ = FORMAT_JPEG;
|
| + } else if (format == keys::kFormatValuePng) {
|
| + image_format_ = FORMAT_PNG;
|
| + } else {
|
| + // Schema validation should make this unreachable.
|
| + EXTENSION_FUNCTION_VALIDATE(0);
|
| + }
|
| + }
|
| +
|
| + if (options->HasKey(keys::kQualityKey)) {
|
| + EXTENSION_FUNCTION_VALIDATE(
|
| + options->GetInteger(keys::kQualityKey, &image_quality_));
|
| + }
|
| + }
|
| +
|
| TabContents* tab_contents = browser->GetSelectedTabContents();
|
| if (!tab_contents) {
|
| error_ = keys::kInternalVisibleTabCaptureError;
|
| @@ -884,14 +918,35 @@ void CaptureVisibleTabFunction::Observe(NotificationType type,
|
| // and call SendResponse().
|
| void CaptureVisibleTabFunction::SendResultFromBitmap(
|
| const SkBitmap& screen_capture) {
|
| - scoped_refptr<RefCountedBytes> jpeg_data(new RefCountedBytes);
|
| + scoped_refptr<RefCountedBytes> image_data(new RefCountedBytes);
|
| SkAutoLockPixels screen_capture_lock(screen_capture);
|
| - bool encoded = gfx::JPEGCodec::Encode(
|
| - reinterpret_cast<unsigned char*>(screen_capture.getAddr32(0, 0)),
|
| - gfx::JPEGCodec::FORMAT_BGRA, screen_capture.width(),
|
| - screen_capture.height(),
|
| - static_cast<int>(screen_capture.rowBytes()), 90,
|
| - &jpeg_data->data);
|
| + bool encoded;
|
| + std::string mime_type;
|
| + switch (image_format_) {
|
| + case FORMAT_JPEG:
|
| + encoded = gfx::JPEGCodec::Encode(
|
| + reinterpret_cast<unsigned char*>(screen_capture.getAddr32(0, 0)),
|
| + gfx::JPEGCodec::FORMAT_BGRA,
|
| + screen_capture.width(),
|
| + screen_capture.height(),
|
| + static_cast<int>(screen_capture.rowBytes()), image_quality_,
|
| + &image_data->data);
|
| + mime_type = keys::kMimeTypeJpeg;
|
| + break;
|
| + case FORMAT_PNG:
|
| + encoded = gfx::PNGCodec::Encode(
|
| + reinterpret_cast<unsigned char*>(screen_capture.getAddr32(0, 0)),
|
| + gfx::PNGCodec::FORMAT_BGRA,
|
| + screen_capture.width(),
|
| + screen_capture.height(),
|
| + static_cast<int>(screen_capture.rowBytes()), false,
|
| + &image_data->data);
|
| + mime_type = keys::kMimeTypePng;
|
| + break;
|
| + default:
|
| + NOTREACHED() << "Invalid image format.";
|
| + }
|
| +
|
| if (!encoded) {
|
| error_ = ExtensionErrorUtils::FormatErrorMessage(
|
| keys::kInternalVisibleTabCaptureError, "");
|
| @@ -901,13 +956,13 @@ void CaptureVisibleTabFunction::SendResultFromBitmap(
|
|
|
| std::string base64_result;
|
| std::string stream_as_string;
|
| - stream_as_string.resize(jpeg_data->data.size());
|
| + stream_as_string.resize(image_data->data.size());
|
| memcpy(&stream_as_string[0],
|
| - reinterpret_cast<const char*>(&jpeg_data->data[0]),
|
| - jpeg_data->data.size());
|
| + reinterpret_cast<const char*>(&image_data->data[0]),
|
| + image_data->data.size());
|
|
|
| base::Base64Encode(stream_as_string, &base64_result);
|
| - base64_result.insert(0, "data:image/jpg;base64,");
|
| + base64_result.insert(0, StringPrintf("data:%s;base64,", mime_type.c_str()));
|
| result_.reset(new StringValue(base64_result));
|
| SendResponse(true);
|
| }
|
| @@ -1071,4 +1126,3 @@ static GURL ResolvePossiblyRelativeURL(std::string url_string,
|
|
|
| return url;
|
| }
|
| -
|
|
|