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

Side by Side Diff: third_party/WebKit/Source/platform/feature_policy/FeaturePolicy.cpp

Issue 2483703002: Replicate feature policy headers to remote frames (Closed)
Patch Set: Remove layout test; better coverage with unit tests Created 4 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "platform/feature_policy/FeaturePolicy.h" 5 #include "platform/feature_policy/FeaturePolicy.h"
6 6
7 #include "platform/json/JSONValues.h" 7 #include "platform/json/JSONValues.h"
8 #include "platform/network/HTTPParsers.h" 8 #include "platform/network/HTTPParsers.h"
9 #include "platform/weborigin/KURL.h" 9 #include "platform/weborigin/KURL.h"
10 #include "platform/weborigin/SecurityOrigin.h" 10 #include "platform/weborigin/SecurityOrigin.h"
(...skipping 11 matching lines...) Expand all
22 FeaturePolicy::FeatureList& features) { 22 FeaturePolicy::FeatureList& features) {
23 for (const FeaturePolicy::Feature* feature : features) { 23 for (const FeaturePolicy::Feature* feature : features) {
24 if (featureName == feature->featureName) 24 if (featureName == feature->featureName)
25 return feature; 25 return feature;
26 } 26 }
27 return nullptr; 27 return nullptr;
28 } 28 }
29 29
30 // Converts a list of JSON feature policy items into a mapping of features to 30 // Converts a list of JSON feature policy items into a mapping of features to
31 // whitelists. For future compatibility, unrecognized features are simply 31 // whitelists. For future compatibility, unrecognized features are simply
32 // ignored, as are unparseable origins. Any errors in the input will cause an 32 // ignored, as are unparseable origins. If |messages| is not null, then any
33 // error message appended to |messages|. 33 // errors in the input will cause an error message to be appended to it.
34 HashMap<const FeaturePolicy::Feature*, 34 HashMap<const FeaturePolicy::Feature*,
35 std::unique_ptr<FeaturePolicy::Whitelist>> 35 std::unique_ptr<FeaturePolicy::Whitelist>>
36 parseFeaturePolicyFromJson(std::unique_ptr<JSONArray> policyItems, 36 parseFeaturePolicyFromJson(std::unique_ptr<JSONArray> policyItems,
37 RefPtr<SecurityOrigin> origin, 37 RefPtr<SecurityOrigin> origin,
38 FeaturePolicy::FeatureList& features, 38 FeaturePolicy::FeatureList& features,
39 Vector<String>& messages) { 39 Vector<String>* messages) {
40 HashMap<const FeaturePolicy::Feature*, 40 HashMap<const FeaturePolicy::Feature*,
41 std::unique_ptr<FeaturePolicy::Whitelist>> 41 std::unique_ptr<FeaturePolicy::Whitelist>>
42 whitelists; 42 whitelists;
43 43
44 for (size_t i = 0; i < policyItems->size(); ++i) { 44 for (size_t i = 0; i < policyItems->size(); ++i) {
45 JSONObject* item = JSONObject::cast(policyItems->at(i)); 45 JSONObject* item = JSONObject::cast(policyItems->at(i));
46 if (!item) { 46 if (!item) {
47 messages.append("Policy is not an object"); 47 if (messages)
48 messages->append("Policy is not an object");
48 continue; // Array element is not an object; skip 49 continue; // Array element is not an object; skip
49 } 50 }
50 51
51 for (size_t j = 0; j < item->size(); ++j) { 52 for (size_t j = 0; j < item->size(); ++j) {
52 JSONObject::Entry entry = item->at(j); 53 JSONObject::Entry entry = item->at(j);
53 String featureName = entry.first; 54 String featureName = entry.first;
54 JSONArray* targets = JSONArray::cast(entry.second); 55 JSONArray* targets = JSONArray::cast(entry.second);
55 if (!targets) { 56 if (!targets) {
56 messages.append("Whitelist is not an array of strings."); 57 if (messages)
58 messages->append("Whitelist is not an array of strings.");
57 continue; 59 continue;
58 } 60 }
59 61
60 const FeaturePolicy::Feature* feature = 62 const FeaturePolicy::Feature* feature =
61 featureForName(featureName, features); 63 featureForName(featureName, features);
62 if (!feature) 64 if (!feature)
63 continue; // Feature is not recognized; skip 65 continue; // Feature is not recognized; skip
64 66
65 std::unique_ptr<FeaturePolicy::Whitelist> whitelist( 67 std::unique_ptr<FeaturePolicy::Whitelist> whitelist(
66 new FeaturePolicy::Whitelist); 68 new FeaturePolicy::Whitelist);
67 String targetString; 69 String targetString;
68 for (size_t j = 0; j < targets->size(); ++j) { 70 for (size_t j = 0; j < targets->size(); ++j) {
69 if (targets->at(j)->asString(&targetString)) { 71 if (targets->at(j)->asString(&targetString)) {
70 if (equalIgnoringCase(targetString, "self")) { 72 if (equalIgnoringCase(targetString, "self")) {
71 whitelist->add(origin); 73 whitelist->add(origin);
72 } else if (targetString == "*") { 74 } else if (targetString == "*") {
73 whitelist->addAll(); 75 whitelist->addAll();
74 } else { 76 } else {
75 KURL originUrl = KURL(KURL(), targetString); 77 KURL originUrl = KURL(KURL(), targetString);
76 if (originUrl.isValid()) { 78 if (originUrl.isValid()) {
77 whitelist->add(SecurityOrigin::create(originUrl)); 79 whitelist->add(SecurityOrigin::create(originUrl));
78 } 80 }
79 } 81 }
80 } else { 82 } else {
81 messages.append("Whitelist is not an array of strings."); 83 if (messages)
84 messages->append("Whitelist is not an array of strings.");
82 } 85 }
83 } 86 }
84 whitelists.set(feature, std::move(whitelist)); 87 whitelists.set(feature, std::move(whitelist));
85 } 88 }
86 } 89 }
87 return whitelists; 90 return whitelists;
88 } 91 }
89 92
90 } // namespace 93 } // namespace
91 94
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 189
187 // static 190 // static
188 std::unique_ptr<FeaturePolicy> FeaturePolicy::createFromParentPolicy( 191 std::unique_ptr<FeaturePolicy> FeaturePolicy::createFromParentPolicy(
189 const FeaturePolicy* parent, 192 const FeaturePolicy* parent,
190 RefPtr<SecurityOrigin> currentOrigin) { 193 RefPtr<SecurityOrigin> currentOrigin) {
191 return createFromParentPolicy(parent, std::move(currentOrigin), 194 return createFromParentPolicy(parent, std::move(currentOrigin),
192 getDefaultFeatureList()); 195 getDefaultFeatureList());
193 } 196 }
194 197
195 void FeaturePolicy::setHeaderPolicy(const String& policy, 198 void FeaturePolicy::setHeaderPolicy(const String& policy,
196 Vector<String>& messages) { 199 Vector<String>* messages) {
197 DCHECK(m_headerWhitelists.isEmpty()); 200 DCHECK(m_headerWhitelists.isEmpty());
198 std::unique_ptr<JSONArray> policyJSON = parseJSONHeader(policy); 201 std::unique_ptr<JSONArray> policyJSON = parseJSONHeader(policy);
199 if (!policyJSON) { 202 if (!policyJSON) {
200 messages.append("Unable to parse header"); 203 if (messages)
204 messages->append("Unable to parse header");
201 return; 205 return;
202 } 206 }
203 m_headerWhitelists = parseFeaturePolicyFromJson( 207 m_headerWhitelists = parseFeaturePolicyFromJson(
204 std::move(policyJSON), m_origin, m_features, messages); 208 std::move(policyJSON), m_origin, m_features, messages);
205 } 209 }
206 210
207 bool FeaturePolicy::isFeatureEnabledForOrigin( 211 bool FeaturePolicy::isFeatureEnabledForOrigin(
208 const FeaturePolicy::Feature& feature, 212 const FeaturePolicy::Feature& feature,
209 const SecurityOrigin& origin) const { 213 const SecurityOrigin& origin) const {
210 DCHECK(m_inheritedFeatures.contains(&feature)); 214 DCHECK(m_inheritedFeatures.contains(&feature));
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 sb.append(" "); 255 sb.append(" ");
252 sb.append(whitelist.key->featureName); 256 sb.append(whitelist.key->featureName);
253 sb.append(": "); 257 sb.append(": ");
254 sb.append(whitelist.value->toString()); 258 sb.append(whitelist.value->toString());
255 sb.append("\n"); 259 sb.append("\n");
256 } 260 }
257 return sb.toString(); 261 return sb.toString();
258 } 262 }
259 263
260 } // namespace blink 264 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698