| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/extension_tabs_module.h" | 5 #include "chrome/browser/extensions/extension_tabs_module.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "chrome/browser/browser.h" | 9 #include "chrome/browser/browser.h" |
| 10 #include "chrome/browser/browser_list.h" | 10 #include "chrome/browser/browser_list.h" |
| (...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 882 // For example, some uncommon X11 visual modes are not supported by | 882 // For example, some uncommon X11 visual modes are not supported by |
| 883 // CopyFromBackingStore(). | 883 // CopyFromBackingStore(). |
| 884 bool CaptureVisibleTabFunction::CaptureSnapshotFromBackingStore( | 884 bool CaptureVisibleTabFunction::CaptureSnapshotFromBackingStore( |
| 885 BackingStore* backing_store) { | 885 BackingStore* backing_store) { |
| 886 | 886 |
| 887 skia::PlatformCanvas temp_canvas; | 887 skia::PlatformCanvas temp_canvas; |
| 888 if (!backing_store->CopyFromBackingStore(gfx::Rect(backing_store->size()), | 888 if (!backing_store->CopyFromBackingStore(gfx::Rect(backing_store->size()), |
| 889 &temp_canvas)) { | 889 &temp_canvas)) { |
| 890 return false; | 890 return false; |
| 891 } | 891 } |
| 892 LOG(INFO) << "captureVisibleTab() Got image from backing store."; |
| 893 |
| 892 SendResultFromBitmap( | 894 SendResultFromBitmap( |
| 893 temp_canvas.getTopPlatformDevice().accessBitmap(false)); | 895 temp_canvas.getTopPlatformDevice().accessBitmap(false)); |
| 894 return true; | 896 return true; |
| 895 } | 897 } |
| 896 | 898 |
| 897 // If a backing store was not available in CaptureVisibleTabFunction::RunImpl, | 899 // If a backing store was not available in CaptureVisibleTabFunction::RunImpl, |
| 898 // than the renderer was asked for a snapshot. Listen for a notification | 900 // than the renderer was asked for a snapshot. Listen for a notification |
| 899 // that the snapshot is available. | 901 // that the snapshot is available. |
| 900 void CaptureVisibleTabFunction::Observe(NotificationType type, | 902 void CaptureVisibleTabFunction::Observe(NotificationType type, |
| 901 const NotificationSource& source, | 903 const NotificationSource& source, |
| 902 const NotificationDetails& details) { | 904 const NotificationDetails& details) { |
| 903 DCHECK(type == NotificationType::TAB_SNAPSHOT_TAKEN); | 905 DCHECK(type == NotificationType::TAB_SNAPSHOT_TAKEN); |
| 904 | 906 |
| 905 const SkBitmap *screen_capture = Details<const SkBitmap>(details).ptr(); | 907 const SkBitmap *screen_capture = Details<const SkBitmap>(details).ptr(); |
| 906 const bool error = screen_capture->empty(); | 908 const bool error = screen_capture->empty(); |
| 907 | 909 |
| 908 if (error) { | 910 if (error) { |
| 909 error_ = keys::kInternalVisibleTabCaptureError; | 911 error_ = keys::kInternalVisibleTabCaptureError; |
| 910 SendResponse(false); | 912 SendResponse(false); |
| 911 } else { | 913 } else { |
| 914 LOG(INFO) << "captureVisibleTab() Got image from renderer."; |
| 912 SendResultFromBitmap(*screen_capture); | 915 SendResultFromBitmap(*screen_capture); |
| 913 } | 916 } |
| 914 | 917 |
| 915 Release(); // Balanced in CaptureVisibleTabFunction::RunImpl(). | 918 Release(); // Balanced in CaptureVisibleTabFunction::RunImpl(). |
| 916 } | 919 } |
| 917 | 920 |
| 918 // Turn a bitmap of the screen into an image, set that image as the result, | 921 // Turn a bitmap of the screen into an image, set that image as the result, |
| 919 // and call SendResponse(). | 922 // and call SendResponse(). |
| 920 void CaptureVisibleTabFunction::SendResultFromBitmap( | 923 void CaptureVisibleTabFunction::SendResultFromBitmap( |
| 921 const SkBitmap& screen_capture) { | 924 const SkBitmap& screen_capture) { |
| 922 scoped_refptr<RefCountedBytes> image_data(new RefCountedBytes); | 925 scoped_refptr<RefCountedBytes> image_data(new RefCountedBytes); |
| 923 SkAutoLockPixels screen_capture_lock(screen_capture); | 926 SkAutoLockPixels screen_capture_lock(screen_capture); |
| 924 bool encoded = false; | 927 bool encoded = false; |
| 925 std::string mime_type; | 928 std::string mime_type; |
| 926 switch (image_format_) { | 929 switch (image_format_) { |
| 927 case FORMAT_JPEG: | 930 case FORMAT_JPEG: |
| 928 encoded = gfx::JPEGCodec::Encode( | 931 encoded = gfx::JPEGCodec::Encode( |
| 929 reinterpret_cast<unsigned char*>(screen_capture.getAddr32(0, 0)), | 932 reinterpret_cast<unsigned char*>(screen_capture.getAddr32(0, 0)), |
| 930 gfx::JPEGCodec::FORMAT_BGRA, | 933 gfx::JPEGCodec::FORMAT_BGRA, |
| 931 screen_capture.width(), | 934 screen_capture.width(), |
| 932 screen_capture.height(), | 935 screen_capture.height(), |
| 933 static_cast<int>(screen_capture.rowBytes()), image_quality_, | 936 static_cast<int>(screen_capture.rowBytes()), |
| 937 image_quality_, |
| 934 &image_data->data); | 938 &image_data->data); |
| 935 mime_type = keys::kMimeTypeJpeg; | 939 mime_type = keys::kMimeTypeJpeg; |
| 936 break; | 940 break; |
| 937 case FORMAT_PNG: | 941 case FORMAT_PNG: |
| 938 encoded = gfx::PNGCodec::Encode( | 942 encoded = gfx::PNGCodec::EncodeBGRASkBitmap( |
| 939 reinterpret_cast<unsigned char*>(screen_capture.getAddr32(0, 0)), | 943 screen_capture, |
| 940 gfx::PNGCodec::FORMAT_BGRA, | 944 true, // Discard transparency. |
| 941 screen_capture.width(), | |
| 942 screen_capture.height(), | |
| 943 static_cast<int>(screen_capture.rowBytes()), false, | |
| 944 &image_data->data); | 945 &image_data->data); |
| 945 mime_type = keys::kMimeTypePng; | 946 mime_type = keys::kMimeTypePng; |
| 946 break; | 947 break; |
| 947 default: | 948 default: |
| 948 NOTREACHED() << "Invalid image format."; | 949 NOTREACHED() << "Invalid image format."; |
| 949 } | 950 } |
| 950 | 951 |
| 951 if (!encoded) { | 952 if (!encoded) { |
| 952 error_ = ExtensionErrorUtils::FormatErrorMessage( | 953 error_ = ExtensionErrorUtils::FormatErrorMessage( |
| 953 keys::kInternalVisibleTabCaptureError, ""); | 954 keys::kInternalVisibleTabCaptureError, ""); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1094 } | 1095 } |
| 1095 | 1096 |
| 1096 static GURL ResolvePossiblyRelativeURL(std::string url_string, | 1097 static GURL ResolvePossiblyRelativeURL(std::string url_string, |
| 1097 Extension* extension) { | 1098 Extension* extension) { |
| 1098 GURL url = GURL(url_string); | 1099 GURL url = GURL(url_string); |
| 1099 if (!url.is_valid()) | 1100 if (!url.is_valid()) |
| 1100 url = extension->GetResourceURL(url_string); | 1101 url = extension->GetResourceURL(url_string); |
| 1101 | 1102 |
| 1102 return url; | 1103 return url; |
| 1103 } | 1104 } |
| OLD | NEW |