| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| 11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
| 12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
| 13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 14 #include "chrome/common/chrome_constants.h" | 14 #include "chrome/common/chrome_constants.h" |
| 15 #include "chrome/common/chrome_switches.h" | 15 #include "chrome/common/chrome_switches.h" |
| 16 #include "chrome/common/icon_messages.h" | 16 #include "chrome/common/favicon_url.h" |
| 17 #include "chrome/common/prerender_messages.h" | 17 #include "chrome/common/prerender_messages.h" |
| 18 #include "chrome/common/render_messages.h" | 18 #include "chrome/common/render_messages.h" |
| 19 #include "chrome/common/url_constants.h" | 19 #include "chrome/common/url_constants.h" |
| 20 #include "chrome/renderer/chrome_render_process_observer.h" | 20 #include "chrome/renderer/chrome_render_process_observer.h" |
| 21 #include "chrome/renderer/content_settings_observer.h" | 21 #include "chrome/renderer/content_settings_observer.h" |
| 22 #include "chrome/renderer/extensions/dispatcher.h" | 22 #include "chrome/renderer/extensions/dispatcher.h" |
| 23 #include "chrome/renderer/external_host_bindings.h" | 23 #include "chrome/renderer/external_host_bindings.h" |
| 24 #include "chrome/renderer/frame_sniffer.h" | 24 #include "chrome/renderer/frame_sniffer.h" |
| 25 #include "chrome/renderer/prerender/prerender_helper.h" | 25 #include "chrome/renderer/prerender/prerender_helper.h" |
| 26 #include "chrome/renderer/safe_browsing/phishing_classifier_delegate.h" | 26 #include "chrome/renderer/safe_browsing/phishing_classifier_delegate.h" |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 INSECURE_CONTENT_DISPLAY_HOST_GOOGLE_SUPPORT, | 143 INSECURE_CONTENT_DISPLAY_HOST_GOOGLE_SUPPORT, |
| 144 INSECURE_CONTENT_RUN_HOST_GOOGLE_SUPPORT, | 144 INSECURE_CONTENT_RUN_HOST_GOOGLE_SUPPORT, |
| 145 INSECURE_CONTENT_DISPLAY_HOST_GOOGLE_INTL, | 145 INSECURE_CONTENT_DISPLAY_HOST_GOOGLE_INTL, |
| 146 INSECURE_CONTENT_RUN_HOST_GOOGLE_INTL, | 146 INSECURE_CONTENT_RUN_HOST_GOOGLE_INTL, |
| 147 INSECURE_CONTENT_NUM_EVENTS | 147 INSECURE_CONTENT_NUM_EVENTS |
| 148 }; | 148 }; |
| 149 | 149 |
| 150 // Constants for mixed-content blocking. | 150 // Constants for mixed-content blocking. |
| 151 static const char kGoogleDotCom[] = "google.com"; | 151 static const char kGoogleDotCom[] = "google.com"; |
| 152 | 152 |
| 153 static FaviconURL::IconType ToFaviconType(WebIconURL::Type type) { | |
| 154 switch (type) { | |
| 155 case WebIconURL::TypeFavicon: | |
| 156 return FaviconURL::FAVICON; | |
| 157 case WebIconURL::TypeTouch: | |
| 158 return FaviconURL::TOUCH_ICON; | |
| 159 case WebIconURL::TypeTouchPrecomposed: | |
| 160 return FaviconURL::TOUCH_PRECOMPOSED_ICON; | |
| 161 case WebIconURL::TypeInvalid: | |
| 162 return FaviconURL::INVALID_ICON; | |
| 163 } | |
| 164 return FaviconURL::INVALID_ICON; | |
| 165 } | |
| 166 | |
| 167 static bool isHostInDomain(const std::string& host, const std::string& domain) { | 153 static bool isHostInDomain(const std::string& host, const std::string& domain) { |
| 168 return (EndsWith(host, domain, false) && | 154 return (EndsWith(host, domain, false) && |
| 169 (host.length() == domain.length() || | 155 (host.length() == domain.length() || |
| 170 (host.length() > domain.length() && | 156 (host.length() > domain.length() && |
| 171 host[host.length() - domain.length() - 1] == '.'))); | 157 host[host.length() - domain.length() - 1] == '.'))); |
| 172 } | 158 } |
| 173 | 159 |
| 174 namespace { | 160 namespace { |
| 175 GURL StripRef(const GURL& url) { | 161 GURL StripRef(const GURL& url) { |
| 176 GURL::Replacements replacements; | 162 GURL::Replacements replacements; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 206 | 192 |
| 207 bool ChromeRenderViewObserver::OnMessageReceived(const IPC::Message& message) { | 193 bool ChromeRenderViewObserver::OnMessageReceived(const IPC::Message& message) { |
| 208 bool handled = true; | 194 bool handled = true; |
| 209 IPC_BEGIN_MESSAGE_MAP(ChromeRenderViewObserver, message) | 195 IPC_BEGIN_MESSAGE_MAP(ChromeRenderViewObserver, message) |
| 210 IPC_MESSAGE_HANDLER(ChromeViewMsg_WebUIJavaScript, OnWebUIJavaScript) | 196 IPC_MESSAGE_HANDLER(ChromeViewMsg_WebUIJavaScript, OnWebUIJavaScript) |
| 211 IPC_MESSAGE_HANDLER(ChromeViewMsg_CaptureSnapshot, OnCaptureSnapshot) | 197 IPC_MESSAGE_HANDLER(ChromeViewMsg_CaptureSnapshot, OnCaptureSnapshot) |
| 212 IPC_MESSAGE_HANDLER(ChromeViewMsg_HandleMessageFromExternalHost, | 198 IPC_MESSAGE_HANDLER(ChromeViewMsg_HandleMessageFromExternalHost, |
| 213 OnHandleMessageFromExternalHost) | 199 OnHandleMessageFromExternalHost) |
| 214 IPC_MESSAGE_HANDLER(ChromeViewMsg_JavaScriptStressTestControl, | 200 IPC_MESSAGE_HANDLER(ChromeViewMsg_JavaScriptStressTestControl, |
| 215 OnJavaScriptStressTestControl) | 201 OnJavaScriptStressTestControl) |
| 216 IPC_MESSAGE_HANDLER(IconMsg_DownloadFavicon, OnDownloadFavicon) | |
| 217 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowDisplayingInsecureContent, | 202 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowDisplayingInsecureContent, |
| 218 OnSetAllowDisplayingInsecureContent) | 203 OnSetAllowDisplayingInsecureContent) |
| 219 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowRunningInsecureContent, | 204 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowRunningInsecureContent, |
| 220 OnSetAllowRunningInsecureContent) | 205 OnSetAllowRunningInsecureContent) |
| 221 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetClientSidePhishingDetection, | 206 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetClientSidePhishingDetection, |
| 222 OnSetClientSidePhishingDetection) | 207 OnSetClientSidePhishingDetection) |
| 223 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetVisuallyDeemphasized, | 208 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetVisuallyDeemphasized, |
| 224 OnSetVisuallyDeemphasized) | 209 OnSetVisuallyDeemphasized) |
| 225 #if defined(OS_CHROMEOS) | 210 #if defined(OS_CHROMEOS) |
| 226 IPC_MESSAGE_HANDLER(ChromeViewMsg_StartFrameSniffer, OnStartFrameSniffer) | 211 IPC_MESSAGE_HANDLER(ChromeViewMsg_StartFrameSniffer, OnStartFrameSniffer) |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 | 266 |
| 282 void ChromeRenderViewObserver::OnJavaScriptStressTestControl(int cmd, | 267 void ChromeRenderViewObserver::OnJavaScriptStressTestControl(int cmd, |
| 283 int param) { | 268 int param) { |
| 284 if (cmd == kJavaScriptStressTestSetStressRunType) { | 269 if (cmd == kJavaScriptStressTestSetStressRunType) { |
| 285 v8::Testing::SetStressRunType(static_cast<v8::Testing::StressType>(param)); | 270 v8::Testing::SetStressRunType(static_cast<v8::Testing::StressType>(param)); |
| 286 } else if (cmd == kJavaScriptStressTestPrepareStressRun) { | 271 } else if (cmd == kJavaScriptStressTestPrepareStressRun) { |
| 287 v8::Testing::PrepareStressRun(param); | 272 v8::Testing::PrepareStressRun(param); |
| 288 } | 273 } |
| 289 } | 274 } |
| 290 | 275 |
| 291 void ChromeRenderViewObserver::OnDownloadFavicon(int id, | |
| 292 const GURL& image_url, | |
| 293 int image_size) { | |
| 294 bool data_image_failed = false; | |
| 295 if (image_url.SchemeIs("data")) { | |
| 296 SkBitmap data_image = ImageFromDataUrl(image_url); | |
| 297 data_image_failed = data_image.empty(); | |
| 298 if (!data_image_failed) { | |
| 299 std::vector<SkBitmap> images(1, data_image); | |
| 300 Send(new IconHostMsg_DidDownloadFavicon( | |
| 301 routing_id(), id, image_url, false, image_size, images)); | |
| 302 } | |
| 303 } | |
| 304 | |
| 305 if (data_image_failed || | |
| 306 !DownloadFavicon(id, image_url, image_size)) { | |
| 307 Send(new IconHostMsg_DidDownloadFavicon( | |
| 308 routing_id(), id, image_url, true, image_size, | |
| 309 std::vector<SkBitmap>())); | |
| 310 } | |
| 311 } | |
| 312 | |
| 313 void ChromeRenderViewObserver::OnSetAllowDisplayingInsecureContent(bool allow) { | 276 void ChromeRenderViewObserver::OnSetAllowDisplayingInsecureContent(bool allow) { |
| 314 allow_displaying_insecure_content_ = allow; | 277 allow_displaying_insecure_content_ = allow; |
| 315 WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); | 278 WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); |
| 316 if (main_frame) | 279 if (main_frame) |
| 317 main_frame->reload(); | 280 main_frame->reload(); |
| 318 } | 281 } |
| 319 | 282 |
| 320 void ChromeRenderViewObserver::OnSetAllowRunningInsecureContent(bool allow) { | 283 void ChromeRenderViewObserver::OnSetAllowRunningInsecureContent(bool allow) { |
| 321 allow_running_insecure_content_ = allow; | 284 allow_running_insecure_content_ = allow; |
| 322 OnSetAllowDisplayingInsecureContent(allow); | 285 OnSetAllowDisplayingInsecureContent(allow); |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 673 render_view()->GetContentStateImmediately() ? | 636 render_view()->GetContentStateImmediately() ? |
| 674 0 : kDelayForCaptureMs)); | 637 0 : kDelayForCaptureMs)); |
| 675 | 638 |
| 676 WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); | 639 WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); |
| 677 GURL osd_url = main_frame->document().openSearchDescriptionURL(); | 640 GURL osd_url = main_frame->document().openSearchDescriptionURL(); |
| 678 if (!osd_url.is_empty()) { | 641 if (!osd_url.is_empty()) { |
| 679 Send(new ChromeViewHostMsg_PageHasOSDD( | 642 Send(new ChromeViewHostMsg_PageHasOSDD( |
| 680 routing_id(), render_view()->GetPageId(), osd_url, | 643 routing_id(), render_view()->GetPageId(), osd_url, |
| 681 search_provider::AUTODETECTED_PROVIDER)); | 644 search_provider::AUTODETECTED_PROVIDER)); |
| 682 } | 645 } |
| 683 | |
| 684 int icon_types = WebIconURL::TypeFavicon; | |
| 685 if (chrome::kEnableTouchIcon) | |
| 686 icon_types |= WebIconURL::TypeTouchPrecomposed | WebIconURL::TypeTouch; | |
| 687 | |
| 688 WebVector<WebIconURL> icon_urls = | |
| 689 render_view()->GetWebView()->mainFrame()->iconURLs(icon_types); | |
| 690 std::vector<FaviconURL> urls; | |
| 691 for (size_t i = 0; i < icon_urls.size(); i++) { | |
| 692 WebURL url = icon_urls[i].iconURL(); | |
| 693 if (!url.isEmpty()) | |
| 694 urls.push_back(FaviconURL(url, ToFaviconType(icon_urls[i].iconType()))); | |
| 695 } | |
| 696 if (!urls.empty()) { | |
| 697 Send(new IconHostMsg_UpdateFaviconURL( | |
| 698 routing_id(), render_view()->GetPageId(), urls)); | |
| 699 } | |
| 700 } | |
| 701 | |
| 702 void ChromeRenderViewObserver::DidChangeIcon(WebFrame* frame, | |
| 703 WebIconURL::Type icon_type) { | |
| 704 if (frame->parent()) | |
| 705 return; | |
| 706 | |
| 707 if (!chrome::kEnableTouchIcon && | |
| 708 icon_type != WebIconURL::TypeFavicon) | |
| 709 return; | |
| 710 | |
| 711 WebVector<WebIconURL> icon_urls = frame->iconURLs(icon_type); | |
| 712 std::vector<FaviconURL> urls; | |
| 713 for (size_t i = 0; i < icon_urls.size(); i++) { | |
| 714 urls.push_back(FaviconURL(icon_urls[i].iconURL(), | |
| 715 ToFaviconType(icon_urls[i].iconType()))); | |
| 716 } | |
| 717 Send(new IconHostMsg_UpdateFaviconURL( | |
| 718 routing_id(), render_view()->GetPageId(), urls)); | |
| 719 } | 646 } |
| 720 | 647 |
| 721 void ChromeRenderViewObserver::DidCommitProvisionalLoad( | 648 void ChromeRenderViewObserver::DidCommitProvisionalLoad( |
| 722 WebFrame* frame, bool is_new_navigation) { | 649 WebFrame* frame, bool is_new_navigation) { |
| 723 if (!is_new_navigation) | 650 if (!is_new_navigation) |
| 724 return; | 651 return; |
| 725 | 652 |
| 726 CapturePageInfoLater( | 653 CapturePageInfoLater( |
| 727 true, // preliminary_capture | 654 true, // preliminary_capture |
| 728 base::TimeDelta::FromMilliseconds(kDelayForForcedCaptureMs)); | 655 base::TimeDelta::FromMilliseconds(kDelayForForcedCaptureMs)); |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 914 } | 841 } |
| 915 | 842 |
| 916 ExternalHostBindings* ChromeRenderViewObserver::GetExternalHostBindings() { | 843 ExternalHostBindings* ChromeRenderViewObserver::GetExternalHostBindings() { |
| 917 if (!external_host_bindings_.get()) { | 844 if (!external_host_bindings_.get()) { |
| 918 external_host_bindings_.reset(new ExternalHostBindings( | 845 external_host_bindings_.reset(new ExternalHostBindings( |
| 919 render_view(), routing_id())); | 846 render_view(), routing_id())); |
| 920 } | 847 } |
| 921 return external_host_bindings_.get(); | 848 return external_host_bindings_.get(); |
| 922 } | 849 } |
| 923 | 850 |
| 924 bool ChromeRenderViewObserver::DownloadFavicon(int id, | |
| 925 const GURL& image_url, | |
| 926 int image_size) { | |
| 927 // Make sure webview was not shut down. | |
| 928 if (!render_view()->GetWebView()) | |
| 929 return false; | |
| 930 // Create an image resource fetcher and assign it with a call back object. | |
| 931 image_fetchers_.push_back(linked_ptr<MultiResolutionImageResourceFetcher>( | |
| 932 new MultiResolutionImageResourceFetcher( | |
| 933 image_url, render_view()->GetWebView()->mainFrame(), id, | |
| 934 WebURLRequest::TargetIsFavicon, | |
| 935 base::Bind(&ChromeRenderViewObserver::DidDownloadFavicon, | |
| 936 base::Unretained(this), image_size)))); | |
| 937 return true; | |
| 938 } | |
| 939 | |
| 940 void ChromeRenderViewObserver::DidDownloadFavicon( | |
| 941 int requested_size, | |
| 942 MultiResolutionImageResourceFetcher* fetcher, | |
| 943 const std::vector<SkBitmap>& images) { | |
| 944 // Notify requester of image download status. | |
| 945 Send(new IconHostMsg_DidDownloadFavicon(routing_id(), | |
| 946 fetcher->id(), | |
| 947 fetcher->image_url(), | |
| 948 images.empty(), | |
| 949 requested_size, | |
| 950 images)); | |
| 951 | |
| 952 // Remove the image fetcher from our pending list. We're in the callback from | |
| 953 // MultiResolutionImageResourceFetcher, best to delay deletion. | |
| 954 ImageResourceFetcherList::iterator iter; | |
| 955 for (iter = image_fetchers_.begin(); iter != image_fetchers_.end(); ++iter) { | |
| 956 if (iter->get() == fetcher) { | |
| 957 iter->release(); | |
| 958 image_fetchers_.erase(iter); | |
| 959 break; | |
| 960 } | |
| 961 } | |
| 962 MessageLoop::current()->DeleteSoon(FROM_HERE, fetcher); | |
| 963 } | |
| 964 | |
| 965 SkBitmap ChromeRenderViewObserver::ImageFromDataUrl(const GURL& url) const { | |
| 966 std::string mime_type, char_set, data; | |
| 967 if (net::DataURL::Parse(url, &mime_type, &char_set, &data) && !data.empty()) { | |
| 968 // Decode the favicon using WebKit's image decoder. | |
| 969 webkit_glue::ImageDecoder decoder( | |
| 970 gfx::Size(gfx::kFaviconSize, gfx::kFaviconSize)); | |
| 971 const unsigned char* src_data = | |
| 972 reinterpret_cast<const unsigned char*>(&data[0]); | |
| 973 | |
| 974 return decoder.Decode(src_data, data.size()); | |
| 975 } | |
| 976 return SkBitmap(); | |
| 977 } | |
| 978 | |
| 979 bool ChromeRenderViewObserver::IsStrictSecurityHost(const std::string& host) { | 851 bool ChromeRenderViewObserver::IsStrictSecurityHost(const std::string& host) { |
| 980 return (strict_security_hosts_.find(host) != strict_security_hosts_.end()); | 852 return (strict_security_hosts_.find(host) != strict_security_hosts_.end()); |
| 981 } | 853 } |
| OLD | NEW |