Chromium Code Reviews| 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 "content/renderer/render_view_impl.h" | 5 #include "content/renderer/render_view_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 178 #include "ui/gfx/point.h" | 178 #include "ui/gfx/point.h" |
| 179 #include "ui/gfx/rect.h" | 179 #include "ui/gfx/rect.h" |
| 180 #include "ui/gfx/size_conversions.h" | 180 #include "ui/gfx/size_conversions.h" |
| 181 #include "v8/include/v8.h" | 181 #include "v8/include/v8.h" |
| 182 #include "webkit/appcache/web_application_cache_host_impl.h" | 182 #include "webkit/appcache/web_application_cache_host_impl.h" |
| 183 #include "webkit/base/file_path_string_conversions.h" | 183 #include "webkit/base/file_path_string_conversions.h" |
| 184 #include "webkit/dom_storage/dom_storage_types.h" | 184 #include "webkit/dom_storage/dom_storage_types.h" |
| 185 #include "webkit/glue/alt_error_page_resource_fetcher.h" | 185 #include "webkit/glue/alt_error_page_resource_fetcher.h" |
| 186 #include "webkit/glue/dom_operations.h" | 186 #include "webkit/glue/dom_operations.h" |
| 187 #include "webkit/glue/glue_serialize.h" | 187 #include "webkit/glue/glue_serialize.h" |
| 188 #include "webkit/glue/resource_request_body.h" | |
| 188 #include "webkit/glue/web_intent_service_data.h" | 189 #include "webkit/glue/web_intent_service_data.h" |
| 189 #include "webkit/glue/webdropdata.h" | 190 #include "webkit/glue/webdropdata.h" |
| 190 #include "webkit/glue/webkit_constants.h" | 191 #include "webkit/glue/webkit_constants.h" |
| 191 #include "webkit/glue/webkit_glue.h" | 192 #include "webkit/glue/webkit_glue.h" |
| 192 #include "webkit/glue/weburlresponse_extradata_impl.h" | 193 #include "webkit/glue/weburlresponse_extradata_impl.h" |
| 193 #include "webkit/gpu/webgraphicscontext3d_in_process_impl.h" | 194 #include "webkit/gpu/webgraphicscontext3d_in_process_impl.h" |
| 194 #include "webkit/media/webmediaplayer_impl.h" | 195 #include "webkit/media/webmediaplayer_impl.h" |
| 195 #include "webkit/media/webmediaplayer_ms.h" | 196 #include "webkit/media/webmediaplayer_ms.h" |
| 196 #include "webkit/plugins/npapi/plugin_list.h" | 197 #include "webkit/plugins/npapi/plugin_list.h" |
| 197 #include "webkit/plugins/npapi/webplugin_delegate.h" | 198 #include "webkit/plugins/npapi/webplugin_delegate.h" |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 313 using WebKit::WebVector; | 314 using WebKit::WebVector; |
| 314 using WebKit::WebView; | 315 using WebKit::WebView; |
| 315 using WebKit::WebWidget; | 316 using WebKit::WebWidget; |
| 316 using WebKit::WebWindowFeatures; | 317 using WebKit::WebWindowFeatures; |
| 317 using appcache::WebApplicationCacheHostImpl; | 318 using appcache::WebApplicationCacheHostImpl; |
| 318 using base::Time; | 319 using base::Time; |
| 319 using base::TimeDelta; | 320 using base::TimeDelta; |
| 320 | 321 |
| 321 using webkit_glue::AltErrorPageResourceFetcher; | 322 using webkit_glue::AltErrorPageResourceFetcher; |
| 322 using webkit_glue::ResourceFetcher; | 323 using webkit_glue::ResourceFetcher; |
| 324 using webkit_glue::ResourceRequestBody; | |
| 323 using webkit_glue::WebPreferences; | 325 using webkit_glue::WebPreferences; |
| 324 using webkit_glue::WebURLResponseExtraDataImpl; | 326 using webkit_glue::WebURLResponseExtraDataImpl; |
| 325 | 327 |
| 326 #if defined(OS_ANDROID) | 328 #if defined(OS_ANDROID) |
| 327 using WebKit::WebContentDetectionResult; | 329 using WebKit::WebContentDetectionResult; |
| 328 using WebKit::WebFloatPoint; | 330 using WebKit::WebFloatPoint; |
| 329 using WebKit::WebFloatRect; | 331 using WebKit::WebFloatRect; |
| 330 using WebKit::WebHitTestResult; | 332 using WebKit::WebHitTestResult; |
| 331 #endif | 333 #endif |
| 332 | 334 |
| (...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1125 | 1127 |
| 1126 if (!params.extra_headers.empty()) { | 1128 if (!params.extra_headers.empty()) { |
| 1127 for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(), | 1129 for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(), |
| 1128 params.extra_headers.end(), "\n"); | 1130 params.extra_headers.end(), "\n"); |
| 1129 i.GetNext(); ) { | 1131 i.GetNext(); ) { |
| 1130 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), | 1132 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), |
| 1131 WebString::fromUTF8(i.values())); | 1133 WebString::fromUTF8(i.values())); |
| 1132 } | 1134 } |
| 1133 } | 1135 } |
| 1134 | 1136 |
| 1135 if (params.is_post) { | 1137 // Deal With Cross-Process Post Submission |
|
michaeln
2012/11/05 23:38:29
Since this isn't always for cross-process post han
irobert
2012/11/06 05:39:20
Done.
| |
| 1136 request.setHTTPMethod(WebString::fromUTF8("POST")); | 1138 if(params.is_post) { |
| 1137 | |
| 1138 // Set post data. | |
| 1139 WebHTTPBody http_body; | 1139 WebHTTPBody http_body; |
| 1140 http_body.initialize(); | 1140 http_body.initialize(); |
| 1141 http_body.appendData(WebData( | 1141 const std::vector<ResourceRequestBody::Element>* uploads = |
| 1142 reinterpret_cast<const char*>( | 1142 params.browser_initiated_post_data->elements(); |
| 1143 ¶ms.browser_initiated_post_data.front()), | 1143 std::vector<ResourceRequestBody::Element>::const_iterator iter; |
| 1144 params.browser_initiated_post_data.size())); | 1144 for (iter = uploads->begin(); iter != uploads->end(); ++iter) { |
| 1145 switch (iter->type()) { | |
| 1146 case ResourceRequestBody::Element::TYPE_BYTES: { | |
| 1147 http_body.appendData(WebData(iter->bytes(), | |
| 1148 static_cast<int>(iter->length()))); | |
| 1149 break; | |
| 1150 } | |
| 1151 case ResourceRequestBody::Element::TYPE_FILE: { | |
| 1152 http_body.appendFileRange( | |
| 1153 WebString::fromUTF8(iter->path().value()), | |
| 1154 static_cast<long long>(iter->offset()), | |
| 1155 static_cast<long long>(iter->length()), | |
| 1156 iter->expected_modification_time().ToDoubleT()); | |
| 1157 break; | |
| 1158 } | |
| 1159 case ResourceRequestBody::Element::TYPE_FILE_FILESYSTEM: { | |
| 1160 CHECK(false); | |
| 1161 break; | |
| 1162 } | |
| 1163 case ResourceRequestBody::Element:: TYPE_BLOB: { | |
| 1164 CHECK(false); | |
| 1165 break; | |
| 1166 } | |
| 1167 default: | |
| 1168 NOTREACHED(); | |
| 1169 } | |
| 1170 } | |
| 1145 request.setHTTPBody(http_body); | 1171 request.setHTTPBody(http_body); |
| 1172 request.setHTTPMethod(WebString::fromUTF8("POST")); | |
|
michaeln
2012/11/05 23:38:29
If it's OK to assume POST as the method here, grea
irobert
2012/11/06 05:39:20
We can assume this from the original code, this pi
michaeln
2012/11/06 22:18:41
Not sure i follow. If content shows up that looks
irobert
2012/11/06 22:25:45
PUT method submission will not end up in this bloc
| |
| 1173 request.setHTTPHeaderField( | |
| 1174 WebString::fromUTF8("Content-Type"), | |
| 1175 WebString::fromUTF8(params.extra_headers)); | |
| 1146 } | 1176 } |
| 1147 | |
| 1148 main_frame->loadRequest(request); | 1177 main_frame->loadRequest(request); |
| 1149 } | 1178 } |
| 1150 | |
| 1151 // In case LoadRequest failed before DidCreateDataSource was called. | 1179 // In case LoadRequest failed before DidCreateDataSource was called. |
| 1152 pending_navigation_params_.reset(); | 1180 pending_navigation_params_.reset(); |
| 1153 } | 1181 } |
| 1154 | 1182 |
| 1155 bool RenderViewImpl::IsBackForwardToStaleEntry( | 1183 bool RenderViewImpl::IsBackForwardToStaleEntry( |
| 1156 const ViewMsg_Navigate_Params& params, | 1184 const ViewMsg_Navigate_Params& params, |
| 1157 bool is_reload) { | 1185 bool is_reload) { |
| 1158 // Make sure this isn't a back/forward to an entry we have already cropped | 1186 // Make sure this isn't a back/forward to an entry we have already cropped |
| 1159 // or replaced from our history, before the browser knew about it. If so, | 1187 // or replaced from our history, before the browser knew about it. If so, |
| 1160 // a new navigation has committed in the mean time, and we can ignore this. | 1188 // a new navigation has committed in the mean time, and we can ignore this. |
| (...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1657 const Referrer& referrer, | 1685 const Referrer& referrer, |
| 1658 WebNavigationPolicy policy) { | 1686 WebNavigationPolicy policy) { |
| 1659 Send(new ViewHostMsg_OpenURL( | 1687 Send(new ViewHostMsg_OpenURL( |
| 1660 routing_id_, | 1688 routing_id_, |
| 1661 url, | 1689 url, |
| 1662 referrer, | 1690 referrer, |
| 1663 NavigationPolicyToDisposition(policy), | 1691 NavigationPolicyToDisposition(policy), |
| 1664 frame->identifier())); | 1692 frame->identifier())); |
| 1665 } | 1693 } |
| 1666 | 1694 |
| 1695 // Handle cross-process Post submit Navigation. | |
| 1696 void RenderViewImpl::OpenPostURL( | |
| 1697 WebFrame* frame, | |
| 1698 const GURL& url, | |
| 1699 const Referrer& referrer, | |
| 1700 WebNavigationPolicy policy, | |
| 1701 const ViewMsg_PostRequest_Params& request) { | |
| 1702 Send(new ViewHostMsg_OpenPostURL( | |
| 1703 routing_id_, | |
| 1704 url, | |
| 1705 referrer, | |
| 1706 NavigationPolicyToDisposition(policy), | |
| 1707 frame->identifier(), | |
| 1708 request)); | |
| 1709 } | |
| 1710 | |
| 1667 // WebViewDelegate ------------------------------------------------------------ | 1711 // WebViewDelegate ------------------------------------------------------------ |
| 1668 | 1712 |
| 1669 void RenderViewImpl::LoadNavigationErrorPage( | 1713 void RenderViewImpl::LoadNavigationErrorPage( |
| 1670 WebFrame* frame, | 1714 WebFrame* frame, |
| 1671 const WebURLRequest& failed_request, | 1715 const WebURLRequest& failed_request, |
| 1672 const WebURLError& error, | 1716 const WebURLError& error, |
| 1673 const std::string& html, | 1717 const std::string& html, |
| 1674 bool replace) { | 1718 bool replace) { |
| 1675 std::string alt_html; | 1719 std::string alt_html; |
| 1676 const std::string* error_html; | 1720 const std::string* error_html; |
| (...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2720 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 2764 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
| 2721 if (command_line.HasSwitch(switches::kEnableStrictSiteIsolation) && | 2765 if (command_line.HasSwitch(switches::kEnableStrictSiteIsolation) && |
| 2722 !frame->parent() && (is_content_initiated || is_redirect)) { | 2766 !frame->parent() && (is_content_initiated || is_redirect)) { |
| 2723 WebString origin_str = frame->document().securityOrigin().toString(); | 2767 WebString origin_str = frame->document().securityOrigin().toString(); |
| 2724 GURL frame_url(origin_str.utf8().data()); | 2768 GURL frame_url(origin_str.utf8().data()); |
| 2725 // TODO(cevans): revisit whether this site check is still necessary once | 2769 // TODO(cevans): revisit whether this site check is still necessary once |
| 2726 // crbug.com/101395 is fixed. | 2770 // crbug.com/101395 is fixed. |
| 2727 if (!net::RegistryControlledDomainService::SameDomainOrHost(frame_url, | 2771 if (!net::RegistryControlledDomainService::SameDomainOrHost(frame_url, |
| 2728 url) || | 2772 url) || |
| 2729 frame_url.scheme() != url.scheme()) { | 2773 frame_url.scheme() != url.scheme()) { |
| 2730 OpenURL(frame, url, referrer, default_policy); | 2774 WebString method = request.httpMethod(); |
| 2775 if(method != WebString("POST")) { | |
| 2776 OpenURL(frame, url, referrer, default_policy); | |
| 2777 } else { | |
| 2778 scoped_refptr<ResourceRequestBody> request_body = | |
| 2779 new ResourceRequestBody(); | |
| 2780 WebHTTPBody body = request.httpBody(); | |
| 2781 WebKit::WebHTTPBody::Element element; | |
| 2782 for (int i=0; body.elementAt(i, element); i++) { | |
| 2783 switch (element.type) { | |
| 2784 case WebHTTPBody::Element::TypeData: | |
| 2785 if (!element.data.isEmpty()) | |
| 2786 request_body->AppendBytes( | |
| 2787 element.data.data(), static_cast<int>(element.data.size())); | |
| 2788 break; | |
| 2789 case WebHTTPBody::Element::TypeFile: { | |
| 2790 if (element.fileLength == -1) { | |
| 2791 request_body->AppendFileRange( | |
| 2792 FilePath(element.filePath.utf8()), | |
| 2793 0, kuint64max, base::Time()); | |
| 2794 } else { | |
| 2795 request_body->AppendFileRange( | |
| 2796 FilePath(element.filePath.utf8()), | |
| 2797 static_cast<uint64>(element.fileStart), | |
| 2798 static_cast<uint64>(element.fileLength), | |
| 2799 base::Time::FromDoubleT(element.modificationTime)); | |
| 2800 } | |
| 2801 break; | |
| 2802 } | |
| 2803 case WebHTTPBody::Element::TypeURL: { | |
| 2804 CHECK(false); | |
| 2805 break; | |
| 2806 } | |
| 2807 case WebHTTPBody::Element::TypeBlob: | |
| 2808 CHECK(false); | |
| 2809 break; | |
| 2810 default: | |
| 2811 NOTREACHED(); | |
| 2812 } | |
| 2813 } | |
| 2814 | |
| 2815 // Extract Header Info. | |
| 2816 WebString ContentType = | |
| 2817 request.httpHeaderField(WebString::fromUTF8("Content-Type")); | |
| 2818 std::string ContentTypeStr (ContentType.utf8().data(), | |
| 2819 ContentType.utf8().length()); | |
| 2820 | |
| 2821 ViewMsg_PostRequest_Params params; | |
| 2822 params.extra_header = ContentTypeStr; | |
| 2823 params.request_body = request_body; | |
| 2824 OpenPostURL(frame, url, referrer, default_policy, params); | |
| 2825 } | |
| 2731 return WebKit::WebNavigationPolicyIgnore; | 2826 return WebKit::WebNavigationPolicyIgnore; |
| 2732 } | 2827 } |
| 2733 } | 2828 } |
| 2734 | 2829 |
| 2735 // If the browser is interested, then give it a chance to look at the request. | 2830 // If the browser is interested, then give it a chance to look at the request. |
| 2736 if (is_content_initiated) { | 2831 if (is_content_initiated) { |
| 2737 bool browser_handles_request = | 2832 bool browser_handles_request = |
| 2738 renderer_preferences_.browser_handles_non_local_top_level_requests && | 2833 renderer_preferences_.browser_handles_non_local_top_level_requests && |
| 2739 IsNonLocalTopLevelNavigation(url, frame, type); | 2834 IsNonLocalTopLevelNavigation(url, frame, type); |
| 2740 if (!browser_handles_request) { | 2835 if (!browser_handles_request) { |
| (...skipping 3602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6343 } | 6438 } |
| 6344 #endif | 6439 #endif |
| 6345 | 6440 |
| 6346 void RenderViewImpl::OnReleaseDisambiguationPopupDIB( | 6441 void RenderViewImpl::OnReleaseDisambiguationPopupDIB( |
| 6347 TransportDIB::Handle dib_handle) { | 6442 TransportDIB::Handle dib_handle) { |
| 6348 TransportDIB* dib = TransportDIB::CreateWithHandle(dib_handle); | 6443 TransportDIB* dib = TransportDIB::CreateWithHandle(dib_handle); |
| 6349 RenderProcess::current()->ReleaseTransportDIB(dib); | 6444 RenderProcess::current()->ReleaseTransportDIB(dib); |
| 6350 } | 6445 } |
| 6351 | 6446 |
| 6352 } // namespace content | 6447 } // namespace content |
| OLD | NEW |