Propagate referrer to new windows (#12397)

* Propagate referrer to new windows

Fixes #9205

* Rearrange -new-window event arguments for backwards-compatibility

* Plumb referrer policy through guest-window-manager

* Document the Referrer structure and its uses

* Add tests for referrer in new windows

* Docs nits
This commit is contained in:
Jeremy Apthorp 2018-04-05 16:13:24 -07:00 committed by Charles Kerr
parent 4316949a1d
commit f0d08f4da1
14 changed files with 186 additions and 22 deletions

View file

@ -481,4 +481,56 @@ v8::Local<v8::Value> Converter<blink::WebCache::ResourceTypeStats>::ToV8(
return dict.GetHandle();
}
// static
v8::Local<v8::Value> Converter<blink::WebReferrerPolicy>::ToV8(
v8::Isolate* isolate,
const blink::WebReferrerPolicy& in) {
switch (in) {
case blink::kWebReferrerPolicyDefault:
return mate::StringToV8(isolate, "default");
case blink::kWebReferrerPolicyAlways:
return mate::StringToV8(isolate, "unsafe-url");
case blink::kWebReferrerPolicyNoReferrerWhenDowngrade:
return mate::StringToV8(isolate, "no-referrer-when-downgrade");
case blink::kWebReferrerPolicyNever:
return mate::StringToV8(isolate, "no-referrer");
case blink::kWebReferrerPolicyOrigin:
return mate::StringToV8(isolate, "origin");
case blink::kWebReferrerPolicyNoReferrerWhenDowngradeOriginWhenCrossOrigin:
return mate::StringToV8(isolate, "strict-origin-when-cross-origin");
case blink::kWebReferrerPolicySameOrigin:
return mate::StringToV8(isolate, "same-origin");
case blink::kWebReferrerPolicyStrictOrigin:
return mate::StringToV8(isolate, "strict-origin");
default:
return mate::StringToV8(isolate, "no-referrer");
}
}
// static
bool Converter<blink::WebReferrerPolicy>::FromV8(v8::Isolate* isolate,
v8::Handle<v8::Value> val, blink::WebReferrerPolicy* out) {
std::string policy = base::ToLowerASCII(V8ToString(val));
if (policy == "default")
*out = blink::kWebReferrerPolicyDefault;
else if (policy == "unsafe-url")
*out = blink::kWebReferrerPolicyAlways;
else if (policy == "no-referrer-when-downgrade")
*out = blink::kWebReferrerPolicyNoReferrerWhenDowngrade;
else if (policy == "no-referrer")
*out = blink::kWebReferrerPolicyNever;
else if (policy == "origin")
*out = blink::kWebReferrerPolicyOrigin;
else if (policy == "strict-origin-when-cross-origin")
*out =
blink::kWebReferrerPolicyNoReferrerWhenDowngradeOriginWhenCrossOrigin;
else if (policy == "same-origin")
*out = blink::kWebReferrerPolicySameOrigin;
else if (policy == "strict-origin")
*out = blink::kWebReferrerPolicyStrictOrigin;
else
return false;
return true;
}
} // namespace mate

View file

@ -119,6 +119,14 @@ struct Converter<blink::WebCache::ResourceTypeStats> {
const blink::WebCache::ResourceTypeStats& stats);
};
template<>
struct Converter<blink::WebReferrerPolicy> {
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
const blink::WebReferrerPolicy& in);
static bool FromV8(v8::Isolate* isolate, v8::Local<v8::Value> val,
blink::WebReferrerPolicy* out);
};
v8::Local<v8::Value> EditFlagsToV8(v8::Isolate* isolate, int editFlags);
v8::Local<v8::Value> MediaFlagsToV8(v8::Isolate* isolate, int mediaFlags);

View file

@ -318,4 +318,31 @@ bool Converter<content::WebContents*>::FromV8(
return true;
}
// static
v8::Local<v8::Value> Converter<content::Referrer>::ToV8(
v8::Isolate* isolate, const content::Referrer& val) {
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
dict.Set("url", ConvertToV8(isolate, val.url));
dict.Set("policy", ConvertToV8(isolate, val.policy));
return mate::ConvertToV8(isolate, dict);
}
// static
bool Converter<content::Referrer>::FromV8(
v8::Isolate* isolate,
v8::Local<v8::Value> val,
content::Referrer* out) {
mate::Dictionary dict;
if (!ConvertFromV8(isolate, val, &dict))
return false;
if (!dict.Get("url", &out->url))
return false;
if (!dict.Get("policy", &out->policy))
return false;
return true;
}
} // namespace mate

View file

@ -9,6 +9,7 @@
#include "content/public/browser/permission_type.h"
#include "content/public/common/menu_item.h"
#include "content/public/common/referrer.h"
#include "content/public/common/stop_find_action.h"
#include "native_mate/converter.h"
#include "third_party/WebKit/public/platform/modules/permissions/permission_status.mojom.h"
@ -71,6 +72,14 @@ struct Converter<content::WebContents*> {
content::WebContents** out);
};
template<>
struct Converter<content::Referrer> {
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
const content::Referrer& val);
static bool FromV8(v8::Isolate* isolate, v8::Local<v8::Value> val,
content::Referrer* out);
};
} // namespace mate
#endif // ATOM_COMMON_NATIVE_MATE_CONVERTERS_CONTENT_CONVERTER_H_