| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/renderer/chrome_render_view_observer.h" | 5 #include "chrome/renderer/chrome_render_view_observer.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/debug/trace_event.h" |
| 8 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 9 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| 10 #include "base/string_util.h" | 11 #include "base/string_util.h" |
| 11 #include "chrome/common/chrome_constants.h" | 12 #include "chrome/common/chrome_constants.h" |
| 12 #include "chrome/common/chrome_switches.h" | 13 #include "chrome/common/chrome_switches.h" |
| 13 #include "chrome/common/icon_messages.h" | 14 #include "chrome/common/icon_messages.h" |
| 14 #include "chrome/common/render_messages.h" | 15 #include "chrome/common/render_messages.h" |
| 15 #include "chrome/common/thumbnail_score.h" | 16 #include "chrome/common/thumbnail_score.h" |
| 16 #include "chrome/common/url_constants.h" | 17 #include "chrome/common/url_constants.h" |
| 17 #include "chrome/renderer/about_handler.h" | 18 #include "chrome/renderer/about_handler.h" |
| (...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 // reload, in-page navigation, or some other load type where we don't want to | 832 // reload, in-page navigation, or some other load type where we don't want to |
| 832 // reindex. Note: subframe navigations after onload increment the page id, | 833 // reindex. Note: subframe navigations after onload increment the page id, |
| 833 // so these will trigger a reindex. | 834 // so these will trigger a reindex. |
| 834 GURL stripped_url(StripRef(url)); | 835 GURL stripped_url(StripRef(url)); |
| 835 if (same_page_id && stripped_url == last_indexed_url_) | 836 if (same_page_id && stripped_url == last_indexed_url_) |
| 836 return; | 837 return; |
| 837 | 838 |
| 838 if (!preliminary_capture) | 839 if (!preliminary_capture) |
| 839 last_indexed_url_ = stripped_url; | 840 last_indexed_url_ = stripped_url; |
| 840 | 841 |
| 842 TRACE_EVENT0("renderer", "ChromeRenderViewObserver::CapturePageInfo"); |
| 843 |
| 841 // Retrieve the frame's full text. | 844 // Retrieve the frame's full text. |
| 842 string16 contents; | 845 string16 contents; |
| 843 CaptureText(main_frame, &contents); | 846 CaptureText(main_frame, &contents); |
| 844 if (translate_helper_) | 847 if (translate_helper_) |
| 845 translate_helper_->PageCaptured(contents); | 848 translate_helper_->PageCaptured(contents); |
| 846 if (contents.size()) { | 849 if (contents.size()) { |
| 847 // Send the text to the browser for indexing (the browser might decide not | 850 // Send the text to the browser for indexing (the browser might decide not |
| 848 // to index, if the URL is HTTPS for instance) and language discovery. | 851 // to index, if the URL is HTTPS for instance) and language discovery. |
| 849 Send(new ChromeViewHostMsg_PageContents(routing_id(), url, load_id, | 852 Send(new ChromeViewHostMsg_PageContents(routing_id(), url, load_id, |
| 850 contents)); | 853 contents)); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 902 return; | 905 return; |
| 903 | 906 |
| 904 // get the URL for this page | 907 // get the URL for this page |
| 905 GURL url(main_frame->document().url()); | 908 GURL url(main_frame->document().url()); |
| 906 if (url.is_empty()) | 909 if (url.is_empty()) |
| 907 return; | 910 return; |
| 908 | 911 |
| 909 if (render_view()->GetSize().IsEmpty()) | 912 if (render_view()->GetSize().IsEmpty()) |
| 910 return; // Don't create an empty thumbnail! | 913 return; // Don't create an empty thumbnail! |
| 911 | 914 |
| 915 TRACE_EVENT0("renderer", "ChromeRenderViewObserver::CaptureThumbnail"); |
| 916 |
| 912 ThumbnailScore score; | 917 ThumbnailScore score; |
| 913 SkBitmap thumbnail; | 918 SkBitmap thumbnail; |
| 914 if (!CaptureFrameThumbnail(render_view()->GetWebView(), kThumbnailWidth, | 919 if (!CaptureFrameThumbnail(render_view()->GetWebView(), kThumbnailWidth, |
| 915 kThumbnailHeight, &thumbnail, &score)) | 920 kThumbnailHeight, &thumbnail, &score)) |
| 916 return; | 921 return; |
| 917 | 922 |
| 918 // send the thumbnail message to the browser process | 923 // send the thumbnail message to the browser process |
| 919 Send(new ChromeViewHostMsg_Thumbnail(routing_id(), url, score, thumbnail)); | 924 Send(new ChromeViewHostMsg_Thumbnail(routing_id(), url, score, thumbnail)); |
| 920 } | 925 } |
| 921 | 926 |
| 922 bool ChromeRenderViewObserver::CaptureFrameThumbnail(WebView* view, | 927 bool ChromeRenderViewObserver::CaptureFrameThumbnail(WebView* view, |
| 923 int w, | 928 int w, |
| 924 int h, | 929 int h, |
| 925 SkBitmap* thumbnail, | 930 SkBitmap* thumbnail, |
| 926 ThumbnailScore* score) { | 931 ThumbnailScore* score) { |
| 927 base::TimeTicks beginning_time = base::TimeTicks::Now(); | 932 base::TimeTicks beginning_time = base::TimeTicks::Now(); |
| 928 | 933 |
| 929 skia::PlatformCanvas canvas; | 934 skia::PlatformCanvas canvas; |
| 930 | 935 |
| 931 // Paint |view| into |canvas|. | 936 { |
| 932 if (!PaintViewIntoCanvas(view, canvas)) | 937 TRACE_EVENT0("renderer", |
| 933 return false; | 938 "ChromeRenderViewObserver::CaptureFrameThumbnail::PaintViewIntoCanvas"); |
| 939 // Paint |view| into |canvas|. |
| 940 if (!PaintViewIntoCanvas(view, canvas)) |
| 941 return false; |
| 942 } |
| 934 | 943 |
| 935 SkDevice* device = skia::GetTopDevice(canvas); | 944 SkDevice* device = skia::GetTopDevice(canvas); |
| 936 | 945 |
| 937 const SkBitmap& src_bmp = device->accessBitmap(false); | 946 const SkBitmap& src_bmp = device->accessBitmap(false); |
| 938 // Cut off the vertical scrollbars (if any). | 947 // Cut off the vertical scrollbars (if any). |
| 939 int src_bmp_width = view->mainFrame()->contentsSize().width; | 948 int src_bmp_width = view->mainFrame()->contentsSize().width; |
| 940 | 949 |
| 941 SkRect dest_rect = { 0, 0, SkIntToScalar(w), SkIntToScalar(h) }; | 950 SkRect dest_rect = { 0, 0, SkIntToScalar(w), SkIntToScalar(h) }; |
| 942 float dest_aspect = dest_rect.width() / dest_rect.height(); | 951 float dest_aspect = dest_rect.width() / dest_rect.height(); |
| 943 | 952 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 966 static_cast<S16CPU>(src_bmp_width / dest_aspect)); | 975 static_cast<S16CPU>(src_bmp_width / dest_aspect)); |
| 967 score->good_clipping = true; | 976 score->good_clipping = true; |
| 968 } | 977 } |
| 969 } | 978 } |
| 970 | 979 |
| 971 score->at_top = (view->mainFrame()->scrollOffset().height == 0); | 980 score->at_top = (view->mainFrame()->scrollOffset().height == 0); |
| 972 | 981 |
| 973 SkBitmap subset; | 982 SkBitmap subset; |
| 974 device->accessBitmap(false).extractSubset(&subset, src_rect); | 983 device->accessBitmap(false).extractSubset(&subset, src_rect); |
| 975 | 984 |
| 985 TRACE_EVENT_BEGIN0("renderer", |
| 986 "ChromeRenderViewObserver::CaptureFrameThumbnail::DownsampleByTwo"); |
| 976 // First do a fast downsample by powers of two to get close to the final size. | 987 // First do a fast downsample by powers of two to get close to the final size. |
| 977 SkBitmap downsampled_subset = | 988 SkBitmap downsampled_subset = |
| 978 SkBitmapOperations::DownsampleByTwoUntilSize(subset, w, h); | 989 SkBitmapOperations::DownsampleByTwoUntilSize(subset, w, h); |
| 990 TRACE_EVENT_END0("renderer", |
| 991 "ChromeRenderViewObserver::CaptureFrameThumbnail::DownsampleByTwo"); |
| 979 | 992 |
| 980 // Do a high-quality resize from the downscaled size to the final size. | 993 { |
| 981 *thumbnail = skia::ImageOperations::Resize( | 994 TRACE_EVENT0("renderer", |
| 982 downsampled_subset, skia::ImageOperations::RESIZE_LANCZOS3, w, h); | 995 "ChromeRenderViewObserver::CaptureFrameThumbnail::DownsampleLanczos3"); |
| 996 // Do a high-quality resize from the downscaled size to the final size. |
| 997 *thumbnail = skia::ImageOperations::Resize( |
| 998 downsampled_subset, skia::ImageOperations::RESIZE_LANCZOS3, w, h); |
| 999 } |
| 983 | 1000 |
| 984 score->boring_score = CalculateBoringScore(thumbnail); | 1001 score->boring_score = CalculateBoringScore(thumbnail); |
| 985 | 1002 |
| 986 HISTOGRAM_TIMES("Renderer4.Thumbnail", | 1003 HISTOGRAM_TIMES("Renderer4.Thumbnail", |
| 987 base::TimeTicks::Now() - beginning_time); | 1004 base::TimeTicks::Now() - beginning_time); |
| 988 | 1005 |
| 989 return true; | 1006 return true; |
| 990 } | 1007 } |
| 991 | 1008 |
| 992 bool ChromeRenderViewObserver::CaptureSnapshot(WebView* view, | 1009 bool ChromeRenderViewObserver::CaptureSnapshot(WebView* view, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1069 // Decode the favicon using WebKit's image decoder. | 1086 // Decode the favicon using WebKit's image decoder. |
| 1070 webkit_glue::ImageDecoder decoder( | 1087 webkit_glue::ImageDecoder decoder( |
| 1071 gfx::Size(gfx::kFaviconSize, gfx::kFaviconSize)); | 1088 gfx::Size(gfx::kFaviconSize, gfx::kFaviconSize)); |
| 1072 const unsigned char* src_data = | 1089 const unsigned char* src_data = |
| 1073 reinterpret_cast<const unsigned char*>(&data[0]); | 1090 reinterpret_cast<const unsigned char*>(&data[0]); |
| 1074 | 1091 |
| 1075 return decoder.Decode(src_data, data.size()); | 1092 return decoder.Decode(src_data, data.size()); |
| 1076 } | 1093 } |
| 1077 return SkBitmap(); | 1094 return SkBitmap(); |
| 1078 } | 1095 } |
| OLD | NEW |