summaryrefslogtreecommitdiff
path: root/chromium/content/common/site_isolation_policy.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/common/site_isolation_policy.cc')
-rw-r--r--chromium/content/common/site_isolation_policy.cc46
1 files changed, 41 insertions, 5 deletions
diff --git a/chromium/content/common/site_isolation_policy.cc b/chromium/content/common/site_isolation_policy.cc
index 8ee09a9c4f8..0d277b01a89 100644
--- a/chromium/content/common/site_isolation_policy.cc
+++ b/chromium/content/common/site_isolation_policy.cc
@@ -4,10 +4,15 @@
#include "content/common/site_isolation_policy.h"
+#include <string>
+
#include "base/command_line.h"
#include "base/feature_list.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/strings/string_split.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
+#include "url/gurl.h"
namespace content {
@@ -29,12 +34,43 @@ bool SiteIsolationPolicy::IsTopDocumentIsolationEnabled() {
// static
bool SiteIsolationPolicy::AreIsolatedOriginsEnabled() {
- // TODO(alexmos): This currently assumes that isolated origins are only added
- // via the command-line switch, which may not be true in the future. Remove
- // this function when AreCrossProcessFramesPossible becomes true on Android
- // above.
return base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kIsolateOrigins);
+ switches::kIsolateOrigins) ||
+ base::FeatureList::IsEnabled(features::kIsolateOrigins);
+}
+
+// static
+std::vector<url::Origin> SiteIsolationPolicy::GetIsolatedOrigins() {
+ std::string cmdline_arg =
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kIsolateOrigins);
+ if (!cmdline_arg.empty())
+ return ParseIsolatedOrigins(cmdline_arg);
+
+ if (base::FeatureList::IsEnabled(features::kIsolateOrigins)) {
+ std::string field_trial_arg = base::GetFieldTrialParamValueByFeature(
+ features::kIsolateOrigins,
+ features::kIsolateOriginsFieldTrialParamName);
+ return ParseIsolatedOrigins(field_trial_arg);
+ }
+
+ return std::vector<url::Origin>();
+}
+
+// static
+std::vector<url::Origin> SiteIsolationPolicy::ParseIsolatedOrigins(
+ base::StringPiece arg) {
+ std::vector<base::StringPiece> origin_strings = base::SplitStringPiece(
+ arg, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+
+ std::vector<url::Origin> origins;
+ origins.reserve(origin_strings.size());
+ for (const base::StringPiece& origin_string : origin_strings) {
+ url::Origin origin = url::Origin::Create(GURL(origin_string));
+ if (!origin.unique())
+ origins.push_back(origin);
+ }
+ return origins;
}
} // namespace content