| 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)
|
|
|