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

Unified 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 FileRead Permission Created 8 years, 2 months 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 side-by-side diff with in-line comments
Download patch
« content/renderer/render_view_impl.h ('K') | « content/renderer/render_view_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_view_impl.cc
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 7d8db32089dc2643db70f074fbbef3646ae138ef..83e9c67c5a4ced7e490a1256c52789a50cc012fe 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -325,6 +325,7 @@ using content::DocumentState;
using content::NavigationState;
using content::PasswordForm;
using content::Referrer;
+using content::WebHTTPPOSTBodyParams;
using content::RenderThread;
using content::RenderViewObserver;
using content::RenderViewVisitor;
@@ -347,6 +348,16 @@ using WebKit::WebFloatRect;
using WebKit::WebHitTestResult;
#endif
+
+// Will find a proper place to move to.
+namespace content {
+ WebHTTPPOSTBodyParams::WebHTTPPOSTBodyParams() {
+ }
+
+ WebHTTPPOSTBodyParams::~WebHTTPPOSTBodyParams() {
+ }
+}
+
//-----------------------------------------------------------------------------
typedef std::map<WebKit::WebView*, RenderViewImpl*> ViewMap;
@@ -1215,22 +1226,39 @@ void RenderViewImpl::OnNavigate(const ViewMsg_Navigate_Params& params) {
}
}
- if (params.is_post) {
- request.setHTTPMethod(WebString::fromUTF8("POST"));
-
- // Set post data.
+ // Deal With Cross-Process Post Submission
+ if(params.is_post) {
WebHTTPBody http_body;
http_body.initialize();
- http_body.appendData(WebData(
- reinterpret_cast<const char*>(
- &params.browser_initiated_post_data.front()),
- params.browser_initiated_post_data.size()));
+ std::vector<content::WebHTTPPOSTBodyParams> post_data = params.post_data;
+ for (std::vector<content::WebHTTPPOSTBodyParams>::iterator it=post_data.begin();
+ it < post_data.end(); it++) {
+ if ((*it).type == content::WebHTTPPOSTBodyParams::TypeData) {
+ std::string postdata = (*it).data;
+ http_body.appendData(WebData(postdata.c_str(), postdata.length()));
+ } else if ((*it).type == content::WebHTTPPOSTBodyParams::TypeFile) {
+ http_body.appendFileRange(WebString::fromUTF8((*it).filePath),
+ (*it).fileStart,
+ (*it).fileLength,
+ (*it).modificationTime);
+ } else if ((*it).type == content::WebHTTPPOSTBodyParams::TypeURL) {
+ http_body.appendURLRange((*it).url,
+ (*it).fileStart,
+ (*it).fileLength,
+ (*it).modificationTime);
+ } else if ((*it).type == content::WebHTTPPOSTBodyParams::TypeBlob) {
+ }
+ }
request.setHTTPBody(http_body);
+ request.setHTTPMethod(WebString::fromUTF8("POST"));
+ WebString content_type_header = WebString::fromUTF8("Content-Type");
+ request.setHTTPHeaderField(
+ content_type_header,
+ WebString::fromUTF8(post_data[0].ContentType));
}
main_frame->loadRequest(request);
michaeln 2012/10/24 23:45:39 I see... this is where the new request is initiate
Charlie Reis 2012/11/05 16:21:40 Yeah, actually this concerns me. Keeping the data
}
-
// In case LoadRequest failed before DidCreateDataSource was called.
pending_navigation_params_.reset();
}
@@ -1747,6 +1775,23 @@ void RenderViewImpl::OpenURL(WebFrame* frame,
frame->identifier()));
}
+// Do not sure whether to change the original OpenURL API by adding a new argument.
+// To avoid too much change, use OpenPostURL API do send ViewHostMsg_OpenPostURL
+// message to browser process.
+void RenderViewImpl::OpenPostURL(WebFrame* frame,
+ const GURL& url,
+ const Referrer& referrer,
+ WebNavigationPolicy policy,
+ std::vector<content::WebHTTPPOSTBodyParams> post_data) {
+ Send(new ViewHostMsg_OpenPostURL(
+ routing_id_,
+ url,
+ referrer,
+ NavigationPolicyToDisposition(policy),
+ frame->identifier(),
+ post_data));
+}
+
// WebViewDelegate ------------------------------------------------------------
void RenderViewImpl::LoadNavigationErrorPage(
@@ -2798,8 +2843,59 @@ WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation(
if (!net::RegistryControlledDomainService::SameDomainOrHost(frame_url,
url) ||
frame_url.scheme() != url.scheme()) {
- OpenURL(frame, url, referrer, default_policy);
- return WebKit::WebNavigationPolicyIgnore;
+ WebString method = request.httpMethod();
+ if(method != WebString("POST")) {
+ OpenURL(frame, url, referrer, default_policy);
michaeln 2012/10/23 23:22:18 I see, so in navigations that get initiated in one
Charlie Reis 2012/10/24 00:40:37 I haven't looked at the rest of this CL yet, but I
michaeln 2012/11/02 01:19:24 It might be slick if post data delivered from rend
Charlie Reis 2012/11/05 16:21:40 Matt Perry added that for doing a process swap dur
+ return WebKit::WebNavigationPolicyIgnore;
+ }
+ else {
+ // Extract Body Info
+ WebHTTPBody body = request.httpBody();
+ std::vector<content::WebHTTPPOSTBodyParams> post_data;
+ WebKit::WebHTTPBody::Element element;
+ for (int i=0; body.elementAt(i, element); i++) {
+ content::WebHTTPPOSTBodyParams post_param;
+ post_param.method = "POST";
+ if (element.type == WebHTTPBody::Element::TypeData) {
+ post_param.type = content::WebHTTPPOSTBodyParams::TypeData;
+ post_param.data = "";
+ post_param.data.append(element.data.data(), element.data.size());
+ post_data.push_back(post_param);
+ } else if (element.type == WebHTTPBody::Element::TypeFile) {
+ post_param.type = content::WebHTTPPOSTBodyParams::TypeFile;
+ #if defined(OS_POSIX)
+ post_param.filePath = base::SysWideToNativeMB(UTF16ToWideHack(element.filePath));
+ #elif defined(OS_WIN)
+ post_param.filePath = UTF16ToWideHack(element.filePath);
+ #endif
+ if (element.fileLength == -1) {
+ post_param.fileStart = 0;
+ post_param.fileLength = kuint64max;
+ post_param.modificationTime = base::Time().ToDoubleT();
+ } else {
+ post_param.fileStart = element.fileStart;
+ post_param.fileLength = element.fileLength;
+ post_param.modificationTime = element.modificationTime;
+ }
+ post_data.push_back(post_param);
+ } else if (element.type == WebHTTPBody::Element::TypeURL) {
+ GURL url = GURL(element.url);
+ DCHECK(url.SchemeIsFileSystem());
+ post_param.url = url;
+ post_param.fileStart = element.fileStart;
+ post_param.fileLength = element.fileLength;
+ post_param.modificationTime = element.modificationTime;
+ post_data.push_back(post_param);
+ } else if (element.type == WebHTTPBody::Element::TypeBlob) {
+ }
+ }
+ // Extract Header Info
+ WebString ContentType = request.httpHeaderField(WebString::fromUTF8("Content-Type"));
+ post_data[0].ContentType = "";
+ post_data[0].ContentType.append(ContentType.utf8().data(), ContentType.utf8().length());
+
+ OpenPostURL(frame, url, referrer, default_policy, post_data);
michaeln 2012/10/23 23:22:18 return WebKit::WebNavigationPolicyIgnore here?
+ }
}
}
« content/renderer/render_view_impl.h ('K') | « content/renderer/render_view_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698