blob: ec5b6c05cc9d4ef87c5bb4e85e9948efa07ae48e [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/worker_host/shared_worker_instance.h"
#include <memory>
#include "base/macros.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
class SharedWorkerInstanceTest : public testing::Test {
protected:
SharedWorkerInstanceTest() {}
SharedWorkerInstance CreateInstance(const GURL& script_url,
const std::string& name,
const url::Origin& constructor_origin) {
return SharedWorkerInstance(
script_url, name, constructor_origin, std::string(),
blink::kWebContentSecurityPolicyTypeReport,
blink::mojom::IPAddressSpace::kPublic,
blink::mojom::SharedWorkerCreationContextType::kNonsecure);
}
bool Matches(const SharedWorkerInstance& instance,
const std::string& url,
const base::StringPiece& name) {
url::Origin constructor_origin;
if (GURL(url).SchemeIs(url::kDataScheme))
constructor_origin = url::Origin::Create(GURL("http://example.com/"));
else
constructor_origin = url::Origin::Create(GURL(url));
return instance.Matches(GURL(url), name.as_string(), constructor_origin);
}
private:
DISALLOW_COPY_AND_ASSIGN(SharedWorkerInstanceTest);
};
TEST_F(SharedWorkerInstanceTest, MatchesTest) {
const std::string kDataURL("data:text/javascript;base64,Ly8gSGVsbG8h");
const std::string kFileURL("file:///w.js");
// SharedWorker that doesn't have a name option.
GURL script_url1("http://example.com/w.js");
std::string name1("");
url::Origin constructor_origin1 = url::Origin::Create(script_url1);
SharedWorkerInstance instance1 =
CreateInstance(script_url1, name1, constructor_origin1);
EXPECT_TRUE(Matches(instance1, "http://example.com/w.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.net/w.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.net/w2.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.com/w.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.net/w.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.net/w2.js", "name"));
EXPECT_FALSE(Matches(instance1, kDataURL, ""));
EXPECT_FALSE(Matches(instance1, kDataURL, "name"));
EXPECT_FALSE(Matches(instance1, kFileURL, ""));
EXPECT_FALSE(Matches(instance1, kFileURL, "name"));
// SharedWorker that has a name option.
GURL script_url2("http://example.com/w.js");
std::string name2("name");
url::Origin constructor_origin2 = url::Origin::Create(script_url2);
SharedWorkerInstance instance2 =
CreateInstance(script_url2, name2, constructor_origin2);
EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.net/w.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.net/w2.js", ""));
EXPECT_TRUE(Matches(instance2, "http://example.com/w.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w2.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", "name2"));
EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", "name2"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w.js", "name2"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w2.js", "name2"));
EXPECT_FALSE(Matches(instance2, kDataURL, ""));
EXPECT_FALSE(Matches(instance2, kDataURL, "name"));
EXPECT_FALSE(Matches(instance2, kFileURL, ""));
EXPECT_FALSE(Matches(instance2, kFileURL, "name"));
}
TEST_F(SharedWorkerInstanceTest, MatchesTest_DataURLWorker) {
const std::string kDataURL("data:text/javascript;base64,Ly8gSGVsbG8h");
const std::string kFileURL("file:///w.js");
// SharedWorker created from a data: URL without a name option.
GURL script_url1(kDataURL);
std::string name1("");
url::Origin constructor_origin1 =
url::Origin::Create(GURL("http://example.com/"));
SharedWorkerInstance instance1 =
CreateInstance(script_url1, name1, constructor_origin1);
EXPECT_FALSE(Matches(instance1, "http://example.com/w.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.net/w.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.net/w2.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.com/w.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.net/w.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.net/w2.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.com/w.js", "name2"));
EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", "name2"));
EXPECT_FALSE(Matches(instance1, "http://example.net/w.js", "name2"));
EXPECT_FALSE(Matches(instance1, "http://example.net/w2.js", "name2"));
// This should match because the instance has the same data: URL, name, and
// constructor origin.
EXPECT_TRUE(Matches(instance1, kDataURL, ""));
EXPECT_FALSE(Matches(instance1, kDataURL, "name"));
EXPECT_FALSE(Matches(instance1, kFileURL, ""));
EXPECT_FALSE(Matches(instance1, kFileURL, "name"));
// SharedWorker created from a data: URL with a name option.
GURL script_url2(kDataURL);
std::string name2("name");
url::Origin constructor_origin2 =
url::Origin::Create(GURL("http://example.com/"));
SharedWorkerInstance instance2 =
CreateInstance(script_url2, name2, constructor_origin2);
EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.net/w.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.net/w2.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w2.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", "name2"));
EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", "name2"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w.js", "name2"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w2.js", "name2"));
EXPECT_FALSE(Matches(instance2, kDataURL, ""));
// This should match because the instance has the same data: URL, name, and
// constructor origin.
EXPECT_TRUE(Matches(instance2, kDataURL, "name"));
EXPECT_FALSE(Matches(instance2, kFileURL, ""));
EXPECT_FALSE(Matches(instance2, kFileURL, "name"));
// SharedWorker created from a data: URL on a remote origin (i.e., example.net
// opposed to example.com) without a name option.
GURL script_url3(kDataURL);
std::string name3("");
url::Origin constructor_origin3 =
url::Origin::Create(GURL("http://example.net/"));
SharedWorkerInstance instance3 =
CreateInstance(script_url3, name3, constructor_origin3);
EXPECT_FALSE(Matches(instance3, "http://example.com/w.js", ""));
EXPECT_FALSE(Matches(instance3, "http://example.com/w2.js", ""));
EXPECT_FALSE(Matches(instance3, "http://example.net/w.js", ""));
EXPECT_FALSE(Matches(instance3, "http://example.net/w2.js", ""));
EXPECT_FALSE(Matches(instance3, "http://example.com/w.js", "name"));
EXPECT_FALSE(Matches(instance3, "http://example.com/w2.js", "name"));
EXPECT_FALSE(Matches(instance3, "http://example.net/w.js", "name"));
EXPECT_FALSE(Matches(instance3, "http://example.net/w2.js", "name"));
EXPECT_FALSE(Matches(instance3, "http://example.com/w.js", "name2"));
EXPECT_FALSE(Matches(instance3, "http://example.com/w2.js", "name2"));
EXPECT_FALSE(Matches(instance3, "http://example.net/w.js", "name2"));
EXPECT_FALSE(Matches(instance3, "http://example.net/w2.js", "name2"));
// This should not match because the instance has a different constructor
// origin.
EXPECT_FALSE(Matches(instance3, kDataURL, ""));
EXPECT_FALSE(Matches(instance3, kDataURL, "name"));
EXPECT_FALSE(Matches(instance3, kFileURL, ""));
EXPECT_FALSE(Matches(instance3, kFileURL, "name"));
// SharedWorker created from a data: URL on a remote origin (i.e., example.net
// opposed to example.com) with a name option.
GURL script_url4(kDataURL);
std::string name4("");
url::Origin constructor_origin4 =
url::Origin::Create(GURL("http://example.net/"));
SharedWorkerInstance instance4 =
CreateInstance(script_url4, name4, constructor_origin4);
EXPECT_FALSE(Matches(instance4, "http://example.com/w.js", ""));
EXPECT_FALSE(Matches(instance4, "http://example.com/w2.js", ""));
EXPECT_FALSE(Matches(instance4, "http://example.net/w.js", ""));
EXPECT_FALSE(Matches(instance4, "http://example.net/w2.js", ""));
EXPECT_FALSE(Matches(instance4, "http://example.com/w.js", "name"));
EXPECT_FALSE(Matches(instance4, "http://example.com/w2.js", "name"));
EXPECT_FALSE(Matches(instance4, "http://example.net/w.js", "name"));
EXPECT_FALSE(Matches(instance4, "http://example.net/w2.js", "name"));
EXPECT_FALSE(Matches(instance4, "http://example.com/w.js", "name2"));
EXPECT_FALSE(Matches(instance4, "http://example.com/w2.js", "name2"));
EXPECT_FALSE(Matches(instance4, "http://example.net/w.js", "name2"));
EXPECT_FALSE(Matches(instance4, "http://example.net/w2.js", "name2"));
EXPECT_FALSE(Matches(instance4, kDataURL, ""));
// This should not match because the instance has a different constructor
// origin.
EXPECT_FALSE(Matches(instance4, kDataURL, "name"));
EXPECT_FALSE(Matches(instance4, kFileURL, ""));
EXPECT_FALSE(Matches(instance4, kFileURL, "name"));
}
TEST_F(SharedWorkerInstanceTest, MatchesTest_FileURLWorker) {
const std::string kDataURL("data:text/javascript;base64,Ly8gSGVsbG8h");
const std::string kFileURL("file:///w.js");
// SharedWorker created from a file:// URL without a name option.
GURL script_url1(kFileURL);
std::string name1("");
url::Origin constructor_origin1 = url::Origin::Create(GURL(kFileURL));
SharedWorkerInstance instance1 =
CreateInstance(script_url1, name1, constructor_origin1);
EXPECT_FALSE(Matches(instance1, "http://example.com/w.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.net/w.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.net/w2.js", ""));
EXPECT_FALSE(Matches(instance1, "http://example.com/w.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.net/w.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.net/w2.js", "name"));
EXPECT_FALSE(Matches(instance1, "http://example.com/w.js", "name2"));
EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", "name2"));
EXPECT_FALSE(Matches(instance1, "http://example.net/w.js", "name2"));
EXPECT_FALSE(Matches(instance1, "http://example.net/w2.js", "name2"));
EXPECT_FALSE(Matches(instance1, kDataURL, ""));
EXPECT_FALSE(Matches(instance1, kDataURL, "name"));
// This should not match because file:// URL is treated as an opaque origin.
EXPECT_FALSE(Matches(instance1, kFileURL, ""));
EXPECT_FALSE(Matches(instance1, kFileURL, "name"));
// SharedWorker created from a file:// URL with a name option.
GURL script_url2(kFileURL);
std::string name2("name");
url::Origin constructor_origin2 = url::Origin::Create(GURL(kFileURL));
SharedWorkerInstance instance2 =
CreateInstance(script_url2, name2, constructor_origin2);
EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.net/w.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.net/w2.js", ""));
EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w2.js", "name"));
EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", "name2"));
EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", "name2"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w.js", "name2"));
EXPECT_FALSE(Matches(instance2, "http://example.net/w2.js", "name2"));
EXPECT_FALSE(Matches(instance2, kDataURL, ""));
EXPECT_FALSE(Matches(instance2, kDataURL, "name"));
EXPECT_FALSE(Matches(instance2, kFileURL, ""));
// This should not match because file:// URL is treated as an opaque origin.
EXPECT_FALSE(Matches(instance2, kFileURL, "name"));
}
TEST_F(SharedWorkerInstanceTest, AddressSpace) {
const blink::mojom::IPAddressSpace kAddressSpaces[] = {
blink::mojom::IPAddressSpace::kLocal,
blink::mojom::IPAddressSpace::kPrivate,
blink::mojom::IPAddressSpace::kPublic};
for (auto address_space : kAddressSpaces) {
SharedWorkerInstance instance(
GURL("http://example.com/w.js"), "name",
url::Origin::Create(GURL("http://example.com/")), std::string(),
blink::kWebContentSecurityPolicyTypeReport, address_space,
blink::mojom::SharedWorkerCreationContextType::kNonsecure);
EXPECT_EQ(address_space, instance.creation_address_space());
}
}
} // namespace content