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

Side by Side Diff: content/browser/web_contents/web_contents_impl.cc

Issue 11193051: To fix the cross-site post submission bug. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Comments Created 8 years, 1 month 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
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/browser/web_contents/web_contents_impl.h" 5 #include "content/browser/web_contents/web_contents_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 // the ResourceDispatcherHost, who unpauses the response. Data is then sent 128 // the ResourceDispatcherHost, who unpauses the response. Data is then sent
129 // to the pending RVH. 129 // to the pending RVH.
130 // - The pending renderer sends a FrameNavigate message that invokes the 130 // - The pending renderer sends a FrameNavigate message that invokes the
131 // DidNavigate method. This replaces the current RVH with the 131 // DidNavigate method. This replaces the current RVH with the
132 // pending RVH. 132 // pending RVH.
133 // - The previous renderer is kept swapped out in RenderViewHostManager in case 133 // - The previous renderer is kept swapped out in RenderViewHostManager in case
134 // the user goes back. The process only stays live if another tab is using 134 // the user goes back. The process only stays live if another tab is using
135 // it, but if so, the existing frame relationships will be maintained. 135 // it, but if so, the existing frame relationships will be maintained.
136 136
137 using webkit_glue::WebPreferences; 137 using webkit_glue::WebPreferences;
138 using webkit_glue::ResourceRequestBody;
138 139
139 namespace content { 140 namespace content {
140 namespace { 141 namespace {
141 142
142 // Amount of time we wait between when a key event is received and the renderer 143 // Amount of time we wait between when a key event is received and the renderer
143 // is queried for its state and pushed to the NavigationEntry. 144 // is queried for its state and pushed to the NavigationEntry.
144 const int kQueryStateDelay = 5000; 145 const int kQueryStateDelay = 5000;
145 146
146 const int kSyncWaitDelay = 40; 147 const int kSyncWaitDelay = 40;
147 148
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 params->extra_headers = entry.extra_headers(); 206 params->extra_headers = entry.extra_headers();
206 params->transferred_request_child_id = 207 params->transferred_request_child_id =
207 entry.transferred_global_request_id().child_id; 208 entry.transferred_global_request_id().child_id;
208 params->transferred_request_request_id = 209 params->transferred_request_request_id =
209 entry.transferred_global_request_id().request_id; 210 entry.transferred_global_request_id().request_id;
210 params->is_overriding_user_agent = entry.GetIsOverridingUserAgent(); 211 params->is_overriding_user_agent = entry.GetIsOverridingUserAgent();
211 // Avoid downloading when in view-source mode. 212 // Avoid downloading when in view-source mode.
212 params->allow_download = !entry.IsViewSourceMode(); 213 params->allow_download = !entry.IsViewSourceMode();
213 params->is_post = entry.GetHasPostData(); 214 params->is_post = entry.GetHasPostData();
214 if(entry.GetBrowserInitiatedPostData()) { 215 if(entry.GetBrowserInitiatedPostData()) {
215 params->browser_initiated_post_data.assign( 216 params->browser_initiated_post_data =
216 entry.GetBrowserInitiatedPostData()->front(), 217 entry.GetBrowserInitiatedPostData();
217 entry.GetBrowserInitiatedPostData()->front() +
218 entry.GetBrowserInitiatedPostData()->size());
219
220 } 218 }
221 219
222 if (reload_type == NavigationControllerImpl::RELOAD_ORIGINAL_REQUEST_URL && 220 if (reload_type == NavigationControllerImpl::RELOAD_ORIGINAL_REQUEST_URL &&
223 entry.GetOriginalRequestURL().is_valid() && !entry.GetHasPostData()) { 221 entry.GetOriginalRequestURL().is_valid() && !entry.GetHasPostData()) {
224 // We may have been redirected when navigating to the current URL. 222 // We may have been redirected when navigating to the current URL.
225 // Use the URL the user originally intended to visit, if it's valid and if a 223 // Use the URL the user originally intended to visit, if it's valid and if a
226 // POST wasn't involved; the latter case avoids issues with sending data to 224 // POST wasn't involved; the latter case avoids issues with sending data to
227 // the wrong page. 225 // the wrong page.
228 params->url = entry.GetOriginalRequestURL(); 226 params->url = entry.GetOriginalRequestURL();
229 } else { 227 } else {
(...skipping 2617 matching lines...) Expand 10 before | Expand all | Expand 10 after
2847 2845
2848 void WebContentsImpl::DocumentOnLoadCompletedInMainFrame( 2846 void WebContentsImpl::DocumentOnLoadCompletedInMainFrame(
2849 RenderViewHost* render_view_host, 2847 RenderViewHost* render_view_host,
2850 int32 page_id) { 2848 int32 page_id) {
2851 NotificationService::current()->Notify( 2849 NotificationService::current()->Notify(
2852 NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 2850 NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
2853 Source<WebContents>(this), 2851 Source<WebContents>(this),
2854 Details<int>(&page_id)); 2852 Details<int>(&page_id));
2855 } 2853 }
2856 2854
2857 void WebContentsImpl::RequestOpenURL(RenderViewHost* rvh, 2855 void WebContentsImpl::RequestOpenURL(
2858 const GURL& url, 2856 RenderViewHost* rvh,
2859 const Referrer& referrer, 2857 const GURL& url,
2860 WindowOpenDisposition disposition, 2858 const Referrer& referrer,
2861 int64 source_frame_id, 2859 WindowOpenDisposition disposition,
2862 bool is_cross_site_redirect) { 2860 int64 source_frame_id,
2861 bool is_cross_site_redirect,
2862 std::string extra_header,
2863 scoped_refptr<ResourceRequestBody> request_body) {
2863 // If this came from a swapped out RenderViewHost, we only allow the request 2864 // If this came from a swapped out RenderViewHost, we only allow the request
2864 // if we are still in the same BrowsingInstance. 2865 // if we are still in the same BrowsingInstance.
2865 if (static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out() && 2866 if (static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out() &&
2866 !rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) { 2867 !rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) {
2867 return; 2868 return;
2868 } 2869 }
2869 2870
2870 // Delegate to RequestTransferURL because this is just the generic 2871 // Delegate to RequestTransferURL because this is just the generic
2871 // case where |old_request_id| is empty. 2872 // case where |old_request_id| is empty.
2872 RequestTransferURL(url, referrer, disposition, source_frame_id, 2873 RequestTransferURL(url, referrer, disposition, source_frame_id,
2873 GlobalRequestID(), is_cross_site_redirect); 2874 GlobalRequestID(), is_cross_site_redirect,
2875 extra_header, request_body);
2874 } 2876 }
2875 2877
2876 void WebContentsImpl::RequestTransferURL( 2878 void WebContentsImpl::RequestTransferURL(
2877 const GURL& url, 2879 const GURL& url,
2878 const Referrer& referrer, 2880 const Referrer& referrer,
2879 WindowOpenDisposition disposition, 2881 WindowOpenDisposition disposition,
2880 int64 source_frame_id, 2882 int64 source_frame_id,
2881 const GlobalRequestID& old_request_id, 2883 const GlobalRequestID& old_request_id,
2882 bool is_cross_site_redirect) { 2884 bool is_cross_site_redirect,
2885 std::string extra_header,
2886 scoped_refptr<ResourceRequestBody> request_body) {
2883 WebContents* new_contents = NULL; 2887 WebContents* new_contents = NULL;
2884 PageTransition transition_type = PAGE_TRANSITION_LINK; 2888 PageTransition transition_type = PAGE_TRANSITION_LINK;
2885 if (render_manager_.web_ui()) { 2889 if (render_manager_.web_ui()) {
2886 // When we're a Web UI, it will provide a page transition type for us (this 2890 // When we're a Web UI, it will provide a page transition type for us (this
2887 // is so the new tab page can specify AUTO_BOOKMARK for automatically 2891 // is so the new tab page can specify AUTO_BOOKMARK for automatically
2888 // generated suggestions). 2892 // generated suggestions).
2889 // 2893 //
2890 // Note also that we hide the referrer for Web UI pages. We don't really 2894 // Note also that we hide the referrer for Web UI pages. We don't really
2891 // want web sites to see a referrer of "chrome://blah" (and some 2895 // want web sites to see a referrer of "chrome://blah" (and some
2892 // chrome: URLs might have search terms or other stuff we don't want to 2896 // chrome: URLs might have search terms or other stuff we don't want to
2893 // send to the site), so we send no referrer. 2897 // send to the site), so we send no referrer.
2894 OpenURLParams params(url, Referrer(), source_frame_id, disposition, 2898 OpenURLParams params(url, Referrer(), source_frame_id, disposition,
2895 render_manager_.web_ui()->GetLinkTransitionType(), 2899 render_manager_.web_ui()->GetLinkTransitionType(),
2896 false /* is_renderer_initiated */); 2900 false /* is_renderer_initiated */);
2897 params.transferred_global_request_id = old_request_id; 2901 params.transferred_global_request_id = old_request_id;
2898 new_contents = OpenURL(params); 2902 new_contents = OpenURL(params);
2899 transition_type = render_manager_.web_ui()->GetLinkTransitionType(); 2903 transition_type = render_manager_.web_ui()->GetLinkTransitionType();
2900 } else { 2904 } else {
2901 OpenURLParams params(url, referrer, source_frame_id, disposition, 2905 OpenURLParams params(url, referrer, source_frame_id, disposition,
2902 PAGE_TRANSITION_LINK, true /* is_renderer_initiated */); 2906 PAGE_TRANSITION_LINK, true /* is_renderer_initiated */);
2903 params.transferred_global_request_id = old_request_id; 2907 params.transferred_global_request_id = old_request_id;
2904 params.is_cross_site_redirect = is_cross_site_redirect; 2908 params.is_cross_site_redirect = is_cross_site_redirect;
2909 if(request_body != NULL) {
Charlie Reis 2012/11/20 05:46:03 nit: Space after if. nit: Don't need "!= NULL"
irobert 2012/11/22 01:37:00 Done.
2910 params.transition = content::PAGE_TRANSITION_FORM_SUBMIT;
2911 params.extra_headers = extra_header;
2912 params.browser_initiated_post_data = request_body;
2913 }
2905 new_contents = OpenURL(params); 2914 new_contents = OpenURL(params);
2906 } 2915 }
2907 if (new_contents) { 2916 if (new_contents) {
2908 // Notify observers. 2917 // Notify observers.
2909 FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2918 FOR_EACH_OBSERVER(WebContentsObserver, observers_,
2910 DidOpenRequestedURL(new_contents, 2919 DidOpenRequestedURL(new_contents,
2911 url, 2920 url,
2912 referrer, 2921 referrer,
2913 disposition, 2922 disposition,
2914 transition_type, 2923 transition_type,
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
3328 3337
3329 BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() { 3338 BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() {
3330 return browser_plugin_guest_.get(); 3339 return browser_plugin_guest_.get();
3331 } 3340 }
3332 3341
3333 BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() { 3342 BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() {
3334 return browser_plugin_embedder_.get(); 3343 return browser_plugin_embedder_.get();
3335 } 3344 }
3336 3345
3337 } // namespace content 3346 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698