Index: content/renderer/render_view_impl.cc |
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc |
index c8d35b7ad626b7e5a8acc177c9059cb61547314c..2d683b391c0d446510b209c46f2e8f091c6dfa95 100644 |
--- a/content/renderer/render_view_impl.cc |
+++ b/content/renderer/render_view_impl.cc |
@@ -84,6 +84,7 @@ |
#include "net/base/net_errors.h" |
#include "net/http/http_util.h" |
#include "ppapi/c/private/ppb_flash_net_connector.h" |
+#include "ppapi/proxy/ppapi_messages.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebAccessibilityObject.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebCString.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" |
@@ -113,6 +114,7 @@ |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebPoint.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebRange.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebReferrerPolicy.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSearchableFormData.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" |
@@ -213,6 +215,7 @@ using WebKit::WebPoint; |
using WebKit::WebPopupMenuInfo; |
using WebKit::WebRange; |
using WebKit::WebRect; |
+using WebKit::WebReferrerPolicy; |
using WebKit::WebScriptSource; |
using WebKit::WebSearchableFormData; |
using WebKit::WebSecurityOrigin; |
@@ -246,6 +249,7 @@ using content::NavigationState; |
using content::RenderThread; |
using content::RenderViewObserver; |
using content::RenderViewVisitor; |
+using content::Referrer; |
using content::V8ValueConverter; |
using webkit_glue::AltErrorPageResourceFetcher; |
using webkit_glue::FormField; |
@@ -278,6 +282,10 @@ static const float kScalingIncrement = 0.1f; |
static const float kScalingIncrementForGesture = 0.01f; |
+static const char* kPredefinedAllowedSocketOrigins[] = { |
+ "okddffdblfhhnmhodogpojmfkjmhinfp" |
+}; |
+ |
static void GetRedirectChain(WebDataSource* ds, std::vector<GURL>* result) { |
WebVector<WebURL> urls; |
ds->redirectChain(urls); |
@@ -302,6 +310,13 @@ static bool IsReload(const ViewMsg_Navigate_Params& params) { |
params.navigation_type == ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE; |
} |
+static WebReferrerPolicy getReferrerPolicyFromRequest( |
+ const WebURLRequest& request) { |
+ return request.extraData() ? |
+ static_cast<RequestExtraData*>(request.extraData())->referrer_policy() : |
+ WebKit::WebReferrerPolicyDefault; |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
int32 RenderViewImpl::next_page_id_ = 1; |
@@ -426,6 +441,18 @@ RenderViewImpl::RenderViewImpl( |
RenderThreadImpl::current()->video_capture_impl_manager()); |
} |
+ for (size_t i = 0; i < arraysize(kPredefinedAllowedSocketOrigins); ++i) |
+ allowed_socket_origins_.insert(kPredefinedAllowedSocketOrigins[i]); |
+ |
+ std::string allowed_list = |
+ command_line.GetSwitchValueASCII(switches::kAllowNaClSocketAPI); |
+ if (!allowed_list.empty()) { |
+ StringTokenizer t(allowed_list, ","); |
+ while (t.GetNext()) { |
+ allowed_socket_origins_.insert(t.token()); |
+ } |
+ } |
+ |
content::GetContentClient()->renderer()->RenderViewCreated(this); |
} |
@@ -578,6 +605,16 @@ bool RenderViewImpl::GetPluginInfo(const GURL& url, |
return found; |
} |
+bool RenderViewImpl::CanUseSocketAPIs() { |
+ WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL; |
+ GURL url(main_frame ? GURL(main_frame->document().url()) : GURL()); |
+ if (!url.is_valid()) |
+ return false; |
+ |
+ return allowed_socket_origins_.find(url.host()) != |
+ allowed_socket_origins_.end(); |
+} |
+ |
bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) { |
WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL; |
if (main_frame) |
@@ -685,6 +722,17 @@ bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) { |
#if defined(ENABLE_FLAPPER_HACKS) |
IPC_MESSAGE_HANDLER(PepperMsg_ConnectTcpACK, OnConnectTcpACK) |
#endif |
+ // TODO(dpolukhin): Move TCP/UDP to a separate message filter. |
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_ConnectACK, |
+ OnTCPSocketConnectACK) |
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_SSLHandshakeACK, |
+ OnTCPSocketSSLHandshakeACK) |
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_ReadACK, OnTCPSocketReadACK) |
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_WriteACK, OnTCPSocketWriteACK) |
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBUDPSocket_BindACK, OnUDPSocketBindACK) |
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBUDPSocket_RecvFromACK, |
+ OnUDPSocketRecvFromACK) |
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBUDPSocket_SendToACK, OnUDPSocketSendToACK) |
#if defined(OS_MACOSX) |
IPC_MESSAGE_HANDLER(ViewMsg_SetInLiveResize, OnSetInLiveResize) |
#endif |
@@ -770,13 +818,13 @@ void RenderViewImpl::OnNavigate(const ViewMsg_Navigate_Params& params) { |
if (main_frame->isViewSourceModeEnabled()) |
request.setCachePolicy(WebURLRequest::ReturnCacheDataElseLoad); |
- if (params.referrer.is_valid()) { |
- if (!WebSecurityPolicy::shouldHideReferrer( |
- params.url, |
- WebString::fromUTF8(params.referrer.spec()))) { |
- request.setHTTPHeaderField(WebString::fromUTF8("Referer"), |
- WebString::fromUTF8(params.referrer.spec())); |
- } |
+ if (params.referrer.url.is_valid()) { |
+ WebString referrer = WebSecurityPolicy::generateReferrerHeader( |
+ params.referrer.policy, |
+ params.url, |
+ WebString::fromUTF8(params.referrer.url.spec())); |
+ if (!referrer.isEmpty()) |
+ request.setHTTPHeaderField(WebString::fromUTF8("Referer"), referrer); |
} |
if (!params.extra_headers.empty()) { |
@@ -1142,16 +1190,17 @@ void RenderViewImpl::UpdateURL(WebFrame* frame) { |
// If we have a valid consumed client redirect source, |
// the page contained a client redirect (meta refresh, document.loc...), |
// so we set the referrer and transition to match. |
- if (completed_client_redirect_src_.is_valid()) { |
- DCHECK(completed_client_redirect_src_ == params.redirects[0]); |
+ if (completed_client_redirect_src_.url.is_valid()) { |
+ DCHECK(completed_client_redirect_src_.url == params.redirects[0]); |
params.referrer = completed_client_redirect_src_; |
params.transition = static_cast<content::PageTransition>( |
params.transition | content::PAGE_TRANSITION_CLIENT_REDIRECT); |
} else { |
// Bug 654101: the referrer will be empty on https->http transitions. It |
// would be nice if we could get the real referrer from somewhere. |
- params.referrer = GURL( |
- original_request.httpHeaderField(WebString::fromUTF8("Referer"))); |
+ params.referrer = Referrer(GURL( |
+ original_request.httpHeaderField(WebString::fromUTF8("Referer"))), |
+ getReferrerPolicyFromRequest(original_request)); |
} |
string16 method = request.httpMethod(); |
@@ -1236,7 +1285,7 @@ void RenderViewImpl::UpdateSessionHistory(WebFrame* frame) { |
void RenderViewImpl::OpenURL(WebFrame* frame, |
const GURL& url, |
- const GURL& referrer, |
+ const Referrer& referrer, |
WebNavigationPolicy policy) { |
Send(new ViewHostMsg_OpenURL( |
routing_id_, |
@@ -1980,7 +2029,8 @@ void RenderViewImpl::loadURLExternally( |
Send(new ViewHostMsg_DownloadUrl(routing_id_, request.url(), referrer, |
suggested_name)); |
} else { |
- OpenURL(frame, request.url(), referrer, policy); |
+ OpenURL(frame, request.url(), |
+ Referrer(referrer, getReferrerPolicyFromRequest(request)), policy); |
} |
} |
@@ -2017,7 +2067,9 @@ WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( |
// TODO(cevans): revisit whether this origin check is still necessary once |
// crbug.com/101395 is fixed. |
if (frame_url.GetOrigin() != url.GetOrigin()) { |
- GURL referrer(request.httpHeaderField(WebString::fromUTF8("Referer"))); |
+ Referrer referrer( |
+ GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), |
+ getReferrerPolicyFromRequest(request)); |
OpenURL(frame, url, referrer, default_policy); |
return WebKit::WebNavigationPolicyIgnore; |
} |
@@ -2028,7 +2080,9 @@ WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( |
if (is_content_initiated && |
renderer_preferences_.browser_handles_top_level_requests && |
IsNonLocalTopLevelNavigation(url, frame, type)) { |
- GURL referrer(request.httpHeaderField(WebString::fromUTF8("Referer"))); |
+ Referrer referrer( |
+ GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), |
+ getReferrerPolicyFromRequest(request)); |
// Reset these counters as the RenderView could be reused for the next |
// navigation. |
page_id_ = -1; |
@@ -2076,8 +2130,11 @@ WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( |
} |
if (should_fork) { |
- GURL referrer(request.httpHeaderField(WebString::fromUTF8("Referer"))); |
- OpenURL(frame, url, send_referrer ? referrer : GURL(), default_policy); |
+ Referrer referrer( |
+ GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), |
+ getReferrerPolicyFromRequest(request)); |
+ OpenURL( |
+ frame, url, send_referrer ? referrer : Referrer(), default_policy); |
return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. |
} |
} |
@@ -2147,7 +2204,7 @@ WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( |
if (is_fork || is_noreferrer_and_blank_target) { |
// Open the URL via the browser, not via WebKit. |
- OpenURL(frame, url, GURL(), default_policy); |
+ OpenURL(frame, url, Referrer(), default_policy); |
return WebKit::WebNavigationPolicyIgnore; |
} |
@@ -2245,8 +2302,12 @@ void RenderViewImpl::didCancelClientRedirect(WebFrame* frame) { |
void RenderViewImpl::didCompleteClientRedirect( |
WebFrame* frame, const WebURL& from) { |
- if (!frame->parent()) |
- completed_client_redirect_src_ = from; |
+ if (!frame->parent()) { |
+ WebDataSource* ds = frame->provisionalDataSource(); |
+ CHECK(ds); |
+ completed_client_redirect_src_ = |
+ Referrer(from, getReferrerPolicyFromRequest(ds->request())); |
+ } |
FOR_EACH_OBSERVER( |
RenderViewObserver, observers_, DidCompleteClientRedirect(frame, from)); |
} |
@@ -2376,7 +2437,7 @@ void RenderViewImpl::didStartProvisionalLoad(WebFrame* frame) { |
NavigationGestureUser : NavigationGestureAuto; |
// Make sure redirect tracking state is clear for the new load. |
- completed_client_redirect_src_ = GURL(); |
+ completed_client_redirect_src_ = Referrer(); |
} else if (frame->parent()->isLoading()) { |
// Take note of AUTO_SUBFRAME loads here, so that we can know how to |
// load an error page. See didFailProvisionalLoad. |
@@ -2566,7 +2627,7 @@ void RenderViewImpl::didCommitProvisionalLoad(WebFrame* frame, |
// If this committed load was initiated by a client redirect, we're |
// at the last stop now, so clear it. |
- completed_client_redirect_src_ = GURL(); |
+ completed_client_redirect_src_ = Referrer(); |
// Check whether we have new encoding name. |
UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); |
@@ -3927,6 +3988,8 @@ void RenderViewImpl::OnGetAllSavableResourceLinksForCurrentPage( |
&referrers_list, |
&frames_list); |
+ // FIXME(rdsmith): When GetAllSavableResourceLinksForCurrentPage starts to |
+ // return referrers, it should also return the referrer policies. |
if (!webkit_glue::GetAllSavableResourceLinksForCurrentPage( |
webview(), |
page_url, |
@@ -4714,6 +4777,62 @@ void RenderViewImpl::OnConnectTcpACK( |
} |
#endif |
+void RenderViewImpl::OnTCPSocketConnectACK( |
+ uint32 plugin_dispatcher_id, |
+ uint32 socket_id, |
+ bool succeeded, |
+ const PP_NetAddress_Private& local_addr, |
+ const PP_NetAddress_Private& remote_addr) { |
+ pepper_delegate_.OnTCPSocketConnectACK( |
+ socket_id, succeeded, local_addr, remote_addr); |
+} |
+ |
+void RenderViewImpl::OnTCPSocketSSLHandshakeACK( |
+ uint32 plugin_dispatcher_id, |
+ uint32 socket_id, |
+ bool succeeded) { |
+ pepper_delegate_.OnTCPSocketSSLHandshakeACK(socket_id, succeeded); |
+} |
+ |
+void RenderViewImpl::OnTCPSocketReadACK(uint32 plugin_dispatcher_id, |
+ uint32 socket_id, |
+ bool succeeded, |
+ const std::string& data) { |
+ pepper_delegate_.OnTCPSocketReadACK(socket_id, succeeded, data); |
+} |
+ |
+void RenderViewImpl::OnTCPSocketWriteACK(uint32 plugin_dispatcher_id, |
+ uint32 socket_id, |
+ bool succeeded, |
+ int32_t bytes_written) { |
+ pepper_delegate_.OnTCPSocketWriteACK(socket_id, succeeded, bytes_written); |
+} |
+ |
+void RenderViewImpl::OnUDPSocketBindACK(uint32 plugin_dispatcher_id, |
+ uint32 socket_id, |
+ bool succeeded) { |
+ pepper_delegate_.OnUDPSocketBindACK(socket_id, succeeded); |
+} |
+ |
+void RenderViewImpl::OnUDPSocketRecvFromACK( |
+ uint32 plugin_dispatcher_id, |
+ uint32 socket_id, |
+ bool succeeded, |
+ const std::string& data, |
+ const PP_NetAddress_Private& remote_addr) { |
+ pepper_delegate_.OnUDPSocketRecvFromACK(socket_id, |
+ succeeded, |
+ data, |
+ remote_addr); |
+} |
+ |
+void RenderViewImpl::OnUDPSocketSendToACK(uint32 plugin_dispatcher_id, |
+ uint32 socket_id, |
+ bool succeeded, |
+ int32_t bytes_written) { |
+ pepper_delegate_.OnUDPSocketSendToACK(socket_id, succeeded, bytes_written); |
+} |
+ |
void RenderViewImpl::OnContextMenuClosed( |
const webkit_glue::CustomContextMenuContext& custom_context) { |
if (custom_context.is_pepper_menu) |