Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: content/renderer/render_view_impl.cc

Issue 11193051: To fix the cross-site post submission bug. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Android API, Helper Function and Include_rules Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/renderer/render_view_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 ds->redirectChain(urls); 388 ds->redirectChain(urls);
387 result->reserve(urls.size()); 389 result->reserve(urls.size());
388 for (size_t i = 0; i < urls.size(); ++i) { 390 for (size_t i = 0; i < urls.size(); ++i) {
389 if (urls[i] != GURL(kSwappedOutURL)) 391 if (urls[i] != GURL(kSwappedOutURL))
390 result->push_back(urls[i]); 392 result->push_back(urls[i]);
391 else 393 else
392 result->push_back(blank_url); 394 result->push_back(blank_url);
393 } 395 }
394 } 396 }
395 397
398 static scoped_refptr<ResourceRequestBody> ConstructResourceRequestBody(
399 const WebURLRequest request) {
400 if (request.httpMethod() != WebString("POST") ||
401 request.httpBody().isNull())
402 return NULL;
403
404 scoped_refptr<ResourceRequestBody> request_body = new ResourceRequestBody;
405 WebHTTPBody body = request.httpBody();
406 WebKit::WebHTTPBody::Element element;
407 for (int i=0; body.elementAt(i, element); i++) {
408 switch (element.type) {
409 case WebHTTPBody::Element::TypeData: {
410 if (!element.data.isEmpty())
411 request_body->AppendBytes(element.data.data(),
412 static_cast<int>(element.data.size()));
413 break;
414 }
415 case WebHTTPBody::Element::TypeFile: {
416 #if defined(OS_POSIX)
417 const FilePath::StringType kFilePath =
418 base::SysWideToNativeMB(UTF16ToWideHack(element.filePath));
419 #elif defined(OS_WIN)
420 const FilePath::StringType kFilePath =
421 UTF16ToWideHack(element.filePath);
422 #endif
423 if (element.fileLength == -1) {
424 request_body->AppendFileRange(
425 FilePath(kFilePath), 0, kuint64max, base::Time());
426 } else {
427 request_body->AppendFileRange(
428 FilePath(kFilePath),
429 static_cast<uint64>(element.fileStart),
430 static_cast<uint64>(element.fileLength),
431 base::Time::FromDoubleT(element.modificationTime));
432 }
433 break;
434 }
435 // We do not support TypeURL POST data since it not possible
436 // to make a cross-process POST navigation with this type.
437 case WebHTTPBody::Element::TypeURL: {
438 CHECK(false);
439 break;
440 }
441 // We do not support TypeBlob POST data since it not possible
442 // to make a cross-process POST navigation with this type.
443 case WebHTTPBody::Element::TypeBlob: {
444 CHECK(false);
445 break;
446 }
447 default:
448 NOTREACHED();
449 }
450 }
451 return request_body;
452 }
453
396 // If |data_source| is non-null and has a DocumentState associated with it, 454 // If |data_source| is non-null and has a DocumentState associated with it,
397 // the AltErrorPageResourceFetcher is reset. 455 // the AltErrorPageResourceFetcher is reset.
398 static void StopAltErrorPageFetcher(WebDataSource* data_source) { 456 static void StopAltErrorPageFetcher(WebDataSource* data_source) {
399 if (data_source) { 457 if (data_source) {
400 DocumentState* document_state = DocumentState::FromDataSource(data_source); 458 DocumentState* document_state = DocumentState::FromDataSource(data_source);
401 if (document_state) 459 if (document_state)
402 document_state->set_alt_error_page_fetcher(NULL); 460 document_state->set_alt_error_page_fetcher(NULL);
403 } 461 }
404 } 462 }
405 463
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after
1133 if (!params.extra_headers.empty()) { 1191 if (!params.extra_headers.empty()) {
1134 for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(), 1192 for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(),
1135 params.extra_headers.end(), "\n"); 1193 params.extra_headers.end(), "\n");
1136 i.GetNext(); ) { 1194 i.GetNext(); ) {
1137 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), 1195 request.addHTTPHeaderField(WebString::fromUTF8(i.name()),
1138 WebString::fromUTF8(i.values())); 1196 WebString::fromUTF8(i.values()));
1139 } 1197 }
1140 } 1198 }
1141 1199
1142 if (params.is_post) { 1200 if (params.is_post) {
1143 request.setHTTPMethod(WebString::fromUTF8("POST"));
1144
1145 // Set post data.
1146 WebHTTPBody http_body; 1201 WebHTTPBody http_body;
1147 http_body.initialize(); 1202 http_body.initialize();
1148 http_body.appendData(WebData( 1203 const std::vector<ResourceRequestBody::Element>* uploads =
1149 reinterpret_cast<const char*>( 1204 params.browser_initiated_post_data->elements();
1150 &params.browser_initiated_post_data.front()), 1205 std::vector<ResourceRequestBody::Element>::const_iterator iter;
1151 params.browser_initiated_post_data.size())); 1206 for (iter = uploads->begin(); iter != uploads->end(); ++iter) {
1207 switch (iter->type()) {
1208 case ResourceRequestBody::Element::TYPE_BYTES: {
1209 http_body.appendData(WebData(iter->bytes(),
1210 static_cast<int>(iter->length())));
1211 break;
1212 }
1213 case ResourceRequestBody::Element::TYPE_FILE: {
1214 #if defined(OS_POSIX)
1215 WebString filePath = WideToUTF16Hack(
1216 base::SysNativeMBToWide(iter->path().value()));
1217 #elif defined(OS_WIN)
1218 WebString filePath = WideToUTF16Hack(iter->path().value());
1219 #endif
1220 http_body.appendFileRange(
1221 filePath,
1222 static_cast<long long>(iter->offset()),
1223 static_cast<long long>(iter->length()),
1224 iter->expected_modification_time().ToDoubleT());
1225 break;
1226 }
1227 case ResourceRequestBody::Element::TYPE_FILE_FILESYSTEM: {
1228 CHECK(false);
1229 break;
1230 }
1231 case ResourceRequestBody::Element:: TYPE_BLOB: {
1232 CHECK(false);
1233 break;
1234 }
1235 default:
1236 NOTREACHED();
1237 }
1238 }
1152 request.setHTTPBody(http_body); 1239 request.setHTTPBody(http_body);
1240 request.setHTTPMethod(WebString::fromUTF8("POST"));
1241 request.setHTTPHeaderField(
1242 WebString::fromUTF8("Content-Type"),
1243 WebString::fromUTF8(params.extra_headers));
1153 } 1244 }
1154
1155 main_frame->loadRequest(request); 1245 main_frame->loadRequest(request);
1156 } 1246 }
1157
1158 // In case LoadRequest failed before DidCreateDataSource was called. 1247 // In case LoadRequest failed before DidCreateDataSource was called.
1159 pending_navigation_params_.reset(); 1248 pending_navigation_params_.reset();
1160 } 1249 }
1161 1250
1162 bool RenderViewImpl::IsBackForwardToStaleEntry( 1251 bool RenderViewImpl::IsBackForwardToStaleEntry(
1163 const ViewMsg_Navigate_Params& params, 1252 const ViewMsg_Navigate_Params& params,
1164 bool is_reload) { 1253 bool is_reload) {
1165 // Make sure this isn't a back/forward to an entry we have already cropped 1254 // Make sure this isn't a back/forward to an entry we have already cropped
1166 // or replaced from our history, before the browser knew about it. If so, 1255 // or replaced from our history, before the browser knew about it. If so,
1167 // a new navigation has committed in the mean time, and we can ignore this. 1256 // a new navigation has committed in the mean time, and we can ignore this.
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
1655 if (item.urlString() == WebString::fromUTF8(kSwappedOutURL)) 1744 if (item.urlString() == WebString::fromUTF8(kSwappedOutURL))
1656 return; 1745 return;
1657 1746
1658 Send(new ViewHostMsg_UpdateState( 1747 Send(new ViewHostMsg_UpdateState(
1659 routing_id_, page_id_, webkit_glue::HistoryItemToString(item))); 1748 routing_id_, page_id_, webkit_glue::HistoryItemToString(item)));
1660 } 1749 }
1661 1750
1662 void RenderViewImpl::OpenURL(WebFrame* frame, 1751 void RenderViewImpl::OpenURL(WebFrame* frame,
1663 const GURL& url, 1752 const GURL& url,
1664 const Referrer& referrer, 1753 const Referrer& referrer,
1665 WebNavigationPolicy policy) { 1754 WebNavigationPolicy policy,
1755 std::string extra_header,
1756 scoped_refptr<ResourceRequestBody>
1757 request_body) {
1666 ViewHostMsg_OpenURL_Params params; 1758 ViewHostMsg_OpenURL_Params params;
1667 params.url = url; 1759 params.url = url;
1668 params.referrer = referrer; 1760 params.referrer = referrer;
1669 params.disposition = NavigationPolicyToDisposition(policy); 1761 params.disposition = NavigationPolicyToDisposition(policy);
1670 params.frame_id = frame->identifier(); 1762 params.frame_id = frame->identifier();
1763 params.extra_header = extra_header;
1764 params.request_body = request_body;
1765
1671 DocumentState* document_state = 1766 DocumentState* document_state =
1672 DocumentState::FromDataSource(frame->dataSource()); 1767 DocumentState::FromDataSource(frame->dataSource());
1673 params.is_cross_site_redirect = 1768 params.is_cross_site_redirect =
1674 document_state->navigation_state()->is_redirect_in_progress(); 1769 document_state->navigation_state()->is_redirect_in_progress();
1675
1676 Send(new ViewHostMsg_OpenURL(routing_id_, params)); 1770 Send(new ViewHostMsg_OpenURL(routing_id_, params));
1677 } 1771 }
1678 1772
1679 // WebViewDelegate ------------------------------------------------------------ 1773 // WebViewDelegate ------------------------------------------------------------
1680 1774
1681 void RenderViewImpl::LoadNavigationErrorPage( 1775 void RenderViewImpl::LoadNavigationErrorPage(
1682 WebFrame* frame, 1776 WebFrame* frame,
1683 const WebURLRequest& failed_request, 1777 const WebURLRequest& failed_request,
1684 const WebURLError& error, 1778 const WebURLError& error,
1685 const std::string& html, 1779 const std::string& html,
(...skipping 985 matching lines...) Expand 10 before | Expand all | Expand 10 after
2671 WebFrame* frame, const WebURLRequest& request, 2765 WebFrame* frame, const WebURLRequest& request,
2672 WebNavigationPolicy policy, 2766 WebNavigationPolicy policy,
2673 const WebString& suggested_name) { 2767 const WebString& suggested_name) {
2674 Referrer referrer( 2768 Referrer referrer(
2675 GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), 2769 GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))),
2676 GetReferrerPolicyFromRequest(frame, request)); 2770 GetReferrerPolicyFromRequest(frame, request));
2677 if (policy == WebKit::WebNavigationPolicyDownload) { 2771 if (policy == WebKit::WebNavigationPolicyDownload) {
2678 Send(new ViewHostMsg_DownloadUrl(routing_id_, request.url(), referrer, 2772 Send(new ViewHostMsg_DownloadUrl(routing_id_, request.url(), referrer,
2679 suggested_name)); 2773 suggested_name));
2680 } else { 2774 } else {
2681 OpenURL(frame, request.url(), referrer, policy); 2775 OpenURL(frame, request.url(), referrer, policy, std::string(), NULL);
2682 } 2776 }
2683 } 2777 }
2684 2778
2685 WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( 2779 WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation(
2686 WebFrame* frame, const WebURLRequest& request, WebNavigationType type, 2780 WebFrame* frame, const WebURLRequest& request, WebNavigationType type,
2687 const WebNode&, WebNavigationPolicy default_policy, bool is_redirect) { 2781 const WebNode&, WebNavigationPolicy default_policy, bool is_redirect) {
2688 if (request.url() != GURL(kSwappedOutURL) && 2782 if (request.url() != GURL(kSwappedOutURL) &&
2689 GetContentClient()->renderer()->HandleNavigation(frame, request, type, 2783 GetContentClient()->renderer()->HandleNavigation(frame, request, type,
2690 default_policy, 2784 default_policy,
2691 is_redirect)) { 2785 is_redirect)) {
2692 return WebKit::WebNavigationPolicyIgnore; 2786 return WebKit::WebNavigationPolicyIgnore;
2693 } 2787 }
2694 2788
2695 Referrer referrer( 2789 Referrer referrer(
2696 GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), 2790 GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))),
2697 GetReferrerPolicyFromRequest(frame, request)); 2791 GetReferrerPolicyFromRequest(frame, request));
2698 2792
2793 std::string header;
2794 scoped_refptr<ResourceRequestBody> request_body =
2795 ConstructResourceRequestBody(request);
2796 if (request_body) {
2797 // Extract request header information if request body exist.
2798 WebString ContentType =
2799 request.httpHeaderField(WebString::fromUTF8("Content-Type"));
2800 header.assign(ContentType.utf8().data(), ContentType.utf8().length());
2801 }
2802
2699 if (is_swapped_out_) { 2803 if (is_swapped_out_) {
2700 if (request.url() != GURL(kSwappedOutURL)) { 2804 if (request.url() != GURL(kSwappedOutURL)) {
2701 // Targeted links may try to navigate a swapped out frame. Allow the 2805 // Targeted links may try to navigate a swapped out frame. Allow the
2702 // browser process to navigate the tab instead. Note that it is also 2806 // browser process to navigate the tab instead. Note that it is also
2703 // possible for non-targeted navigations (from this view) to arrive 2807 // possible for non-targeted navigations (from this view) to arrive
2704 // here just after we are swapped out. It's ok to send them to the 2808 // here just after we are swapped out. It's ok to send them to the
2705 // browser, as long as they're for the top level frame. 2809 // browser, as long as they're for the top level frame.
2706 // TODO(creis): Ensure this supports targeted form submissions when 2810 // TODO(creis): Ensure this supports targeted form submissions when
2707 // fixing http://crbug.com/101395. 2811 // fixing http://crbug.com/101395.
2708 if (frame->parent() == NULL) { 2812 if (frame->parent() == NULL) {
2709 OpenURL(frame, request.url(), referrer, default_policy); 2813 OpenURL(frame, request.url(), referrer,
2814 default_policy, header, request_body);
2710 return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. 2815 return WebKit::WebNavigationPolicyIgnore; // Suppress the load here.
2711 } 2816 }
2712 2817
2713 // We should otherwise ignore in-process iframe navigations, if they 2818 // We should otherwise ignore in-process iframe navigations, if they
2714 // arrive just after we are swapped out. 2819 // arrive just after we are swapped out.
2715 return WebKit::WebNavigationPolicyIgnore; 2820 return WebKit::WebNavigationPolicyIgnore;
2716 } 2821 }
2717 2822
2718 // Allow kSwappedOutURL to complete. 2823 // Allow kSwappedOutURL to complete.
2719 return default_policy; 2824 return default_policy;
(...skipping 21 matching lines...) Expand all
2741 command_line.HasSwitch(switches::kSitePerProcess); 2846 command_line.HasSwitch(switches::kSitePerProcess);
2742 if (force_swap_due_to_flag && 2847 if (force_swap_due_to_flag &&
2743 !frame->parent() && (is_content_initiated || is_redirect)) { 2848 !frame->parent() && (is_content_initiated || is_redirect)) {
2744 WebString origin_str = frame->document().securityOrigin().toString(); 2849 WebString origin_str = frame->document().securityOrigin().toString();
2745 GURL frame_url(origin_str.utf8().data()); 2850 GURL frame_url(origin_str.utf8().data());
2746 // TODO(cevans): revisit whether this site check is still necessary once 2851 // TODO(cevans): revisit whether this site check is still necessary once
2747 // crbug.com/101395 is fixed. 2852 // crbug.com/101395 is fixed.
2748 if (!net::RegistryControlledDomainService::SameDomainOrHost(frame_url, 2853 if (!net::RegistryControlledDomainService::SameDomainOrHost(frame_url,
2749 url) || 2854 url) ||
2750 frame_url.scheme() != url.scheme()) { 2855 frame_url.scheme() != url.scheme()) {
2751 OpenURL(frame, url, referrer, default_policy); 2856 OpenURL(frame, url, referrer, default_policy, header, request_body);
2752 return WebKit::WebNavigationPolicyIgnore; 2857 return WebKit::WebNavigationPolicyIgnore;
2753 } 2858 }
2754 } 2859 }
2755 2860
2756 // If the browser is interested, then give it a chance to look at the request. 2861 // If the browser is interested, then give it a chance to look at the request.
2757 if (is_content_initiated) { 2862 if (is_content_initiated) {
2758 bool browser_handles_request = 2863 bool browser_handles_request =
2759 renderer_preferences_.browser_handles_non_local_top_level_requests && 2864 renderer_preferences_.browser_handles_non_local_top_level_requests &&
2760 IsNonLocalTopLevelNavigation(url, frame, type); 2865 IsNonLocalTopLevelNavigation(url, frame, type);
2761 if (!browser_handles_request) { 2866 if (!browser_handles_request) {
2762 browser_handles_request = 2867 browser_handles_request =
2763 renderer_preferences_.browser_handles_all_top_level_requests && 2868 renderer_preferences_.browser_handles_all_top_level_requests &&
2764 IsTopLevelNavigation(frame); 2869 IsTopLevelNavigation(frame);
2765 } 2870 }
2766 2871
2767 if (browser_handles_request) { 2872 if (browser_handles_request) {
2768 // Reset these counters as the RenderView could be reused for the next 2873 // Reset these counters as the RenderView could be reused for the next
2769 // navigation. 2874 // navigation.
2770 page_id_ = -1; 2875 page_id_ = -1;
2771 last_page_id_sent_to_browser_ = -1; 2876 last_page_id_sent_to_browser_ = -1;
2772 OpenURL(frame, url, referrer, default_policy); 2877 OpenURL(frame, url, referrer, default_policy, header, request_body);
2773 return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. 2878 return WebKit::WebNavigationPolicyIgnore; // Suppress the load here.
2774 } 2879 }
2775 } 2880 }
2776 2881
2777 // Use the frame's original request's URL rather than the document's URL for 2882 // Use the frame's original request's URL rather than the document's URL for
2778 // subsequent checks. For a popup, the document's URL may become the opener 2883 // subsequent checks. For a popup, the document's URL may become the opener
2779 // window's URL if the opener has called document.write(). 2884 // window's URL if the opener has called document.write().
2780 // See http://crbug.com/93517. 2885 // See http://crbug.com/93517.
2781 GURL old_url(frame->dataSource()->request().url()); 2886 GURL old_url(frame->dataSource()->request().url());
2782 2887
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2822 if (is_initial_navigation && source_url.is_empty() && frame->opener()) 2927 if (is_initial_navigation && source_url.is_empty() && frame->opener())
2823 source_url = frame->opener()->top()->document().url(); 2928 source_url = frame->opener()->top()->document().url();
2824 DCHECK(!source_url.is_empty()); 2929 DCHECK(!source_url.is_empty());
2825 should_fork = !source_url.SchemeIs(chrome::kFileScheme); 2930 should_fork = !source_url.SchemeIs(chrome::kFileScheme);
2826 } 2931 }
2827 2932
2828 if (!should_fork) { 2933 if (!should_fork) {
2829 // Give the embedder a chance. 2934 // Give the embedder a chance.
2830 // For now, we skip this for POST submissions. This is because 2935 // For now, we skip this for POST submissions. This is because
2831 // http://crbug.com/101395 is more likely to cause compatibility issues 2936 // http://crbug.com/101395 is more likely to cause compatibility issues
2832 // with hosted apps and extensions than WebUI pages. We will remove this 2937 // with hosted apps and extensions than WebUI pages.
2833 // check when cross-process POST submissions are supported.
2834 if (request.httpMethod() == "GET") {
2835 should_fork = GetContentClient()->renderer()->ShouldFork( 2938 should_fork = GetContentClient()->renderer()->ShouldFork(
2836 frame, url, is_initial_navigation, &send_referrer); 2939 frame, url, is_initial_navigation, &send_referrer);
2837 }
2838 } 2940 }
2839 2941
2840 if (should_fork) { 2942 if (should_fork) {
2841 OpenURL( 2943 OpenURL(frame, url, send_referrer ? referrer : Referrer(),
2842 frame, url, send_referrer ? referrer : Referrer(), default_policy); 2944 default_policy, header, request_body);
2843 return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. 2945 return WebKit::WebNavigationPolicyIgnore; // Suppress the load here.
2844 } 2946 }
2845 } 2947 }
2846 2948
2847 // Detect when a page is "forking" a new tab that can be safely rendered in 2949 // Detect when a page is "forking" a new tab that can be safely rendered in
2848 // its own process. This is done by sites like Gmail that try to open links 2950 // its own process. This is done by sites like Gmail that try to open links
2849 // in new windows without script connections back to the original page. We 2951 // in new windows without script connections back to the original page. We
2850 // treat such cases as browser navigations (in which we will create a new 2952 // treat such cases as browser navigations (in which we will create a new
2851 // renderer for a cross-site navigation), rather than WebKit navigations. 2953 // renderer for a cross-site navigation), rather than WebKit navigations.
2852 // 2954 //
(...skipping 18 matching lines...) Expand all
2871 frame->parent() == NULL && 2973 frame->parent() == NULL &&
2872 // Must not have issued the request from this page. 2974 // Must not have issued the request from this page.
2873 is_content_initiated && 2975 is_content_initiated &&
2874 // Must be targeted at the current tab. 2976 // Must be targeted at the current tab.
2875 default_policy == WebKit::WebNavigationPolicyCurrentTab && 2977 default_policy == WebKit::WebNavigationPolicyCurrentTab &&
2876 // Must be a JavaScript navigation, which appears as "other". 2978 // Must be a JavaScript navigation, which appears as "other".
2877 type == WebKit::WebNavigationTypeOther; 2979 type == WebKit::WebNavigationTypeOther;
2878 2980
2879 if (is_fork) { 2981 if (is_fork) {
2880 // Open the URL via the browser, not via WebKit. 2982 // Open the URL via the browser, not via WebKit.
2881 OpenURL(frame, url, Referrer(), default_policy); 2983 OpenURL(frame, url, Referrer(), default_policy, header, request_body);
2882 return WebKit::WebNavigationPolicyIgnore; 2984 return WebKit::WebNavigationPolicyIgnore;
2883 } 2985 }
2884 2986
2885 return default_policy; 2987 return default_policy;
2886 } 2988 }
2887 2989
2888 bool RenderViewImpl::canHandleRequest( 2990 bool RenderViewImpl::canHandleRequest(
2889 WebFrame* frame, const WebURLRequest& request) { 2991 WebFrame* frame, const WebURLRequest& request) {
2890 // We allow WebKit to think that everything can be handled even though 2992 // We allow WebKit to think that everything can be handled even though
2891 // browser-side we limit what we load. 2993 // browser-side we limit what we load.
(...skipping 3552 matching lines...) Expand 10 before | Expand all | Expand 10 after
6444 } 6546 }
6445 #endif 6547 #endif
6446 6548
6447 void RenderViewImpl::OnReleaseDisambiguationPopupDIB( 6549 void RenderViewImpl::OnReleaseDisambiguationPopupDIB(
6448 TransportDIB::Handle dib_handle) { 6550 TransportDIB::Handle dib_handle) {
6449 TransportDIB* dib = TransportDIB::CreateWithHandle(dib_handle); 6551 TransportDIB* dib = TransportDIB::CreateWithHandle(dib_handle);
6450 RenderProcess::current()->ReleaseTransportDIB(dib); 6552 RenderProcess::current()->ReleaseTransportDIB(dib);
6451 } 6553 }
6452 6554
6453 } // namespace content 6555 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_view_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698