blob: bd66a123f0b896cacb41de51cf6a8d3ff5d52dd7 [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 "base/memory/ptr_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/platform/web_cache.h"
#include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
#include "third_party/blink/renderer/bindings/core/v8/script_source_code.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
#include "third_party/blink/renderer/core/frame/frame_test_helpers.h"
#include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
#include "third_party/blink/renderer/platform/bindings/v8_dom_activity_logger.h"
#include "third_party/blink/renderer/platform/wtf/forward.h"
#include "third_party/blink/renderer/platform/wtf/text/base64.h"
#include "v8/include/v8.h"
namespace blink {
using blink::frame_test_helpers::WebViewHelper;
using blink::frame_test_helpers::PumpPendingRequestsForFrameToLoad;
class TestActivityLogger : public V8DOMActivityLogger {
public:
~TestActivityLogger() override = default;
void LogGetter(const String& api_name) override {
logged_activities_.push_back(api_name);
}
void LogSetter(const String& api_name,
const v8::Local<v8::Value>& new_value) override {
logged_activities_.push_back(
api_name + " | " + ToCoreStringWithUndefinedOrNullCheck(new_value));
}
void LogMethod(const String& api_name,
int argc,
const v8::Local<v8::Value>* argv) override {
String activity_string = api_name;
for (int i = 0; i < argc; i++) {
activity_string = activity_string + " | " +
ToCoreStringWithUndefinedOrNullCheck(argv[i]);
}
logged_activities_.push_back(activity_string);
}
void LogEvent(const String& event_name,
int argc,
const String* argv) override {
String activity_string = event_name;
for (int i = 0; i < argc; i++) {
activity_string = activity_string + " | " + argv[i];
}
logged_activities_.push_back(activity_string);
}
void clear() { logged_activities_.clear(); }
bool VerifyActivities(const Vector<String>& expected) const {
EXPECT_EQ(expected.size(), logged_activities_.size());
for (wtf_size_t i = 0;
i < std::min(expected.size(), logged_activities_.size()); ++i) {
EXPECT_STREQ(expected[i].Utf8().data(),
logged_activities_[i].Utf8().data());
}
return logged_activities_ == expected;
}
private:
Vector<String> logged_activities_;
};
class ActivityLoggerTest : public testing::Test {
protected:
ActivityLoggerTest() {
activity_logger_ = new TestActivityLogger();
V8DOMActivityLogger::SetActivityLogger(kIsolatedWorldId, String(),
base::WrapUnique(activity_logger_));
web_view_helper_.Initialize();
script_controller_ = &web_view_helper_.GetWebView()
->MainFrameImpl()
->GetFrame()
->GetScriptController();
frame_test_helpers::LoadFrame(
web_view_helper_.GetWebView()->MainFrameImpl(), "about:blank");
}
~ActivityLoggerTest() override { WebCache::Clear(); }
void ExecuteScriptInMainWorld(const String& script) const {
v8::HandleScope scope(v8::Isolate::GetCurrent());
script_controller_->ExecuteScriptInMainWorld(script);
PumpPendingRequestsForFrameToLoad(web_view_helper_.LocalMainFrame());
}
void ExecuteScriptInIsolatedWorld(const String& script) const {
v8::HandleScope scope(v8::Isolate::GetCurrent());
script_controller_->ExecuteScriptInIsolatedWorld(
kIsolatedWorldId, ScriptSourceCode(script), KURL(),
SanitizeScriptErrors::kSanitize);
PumpPendingRequestsForFrameToLoad(web_view_helper_.LocalMainFrame());
}
bool VerifyActivities(const String& activities) {
Vector<String> activity_vector;
activities.Split("\n", activity_vector);
return activity_logger_->VerifyActivities(activity_vector);
}
private:
static const int kIsolatedWorldId = 1;
WebViewHelper web_view_helper_;
Persistent<ScriptController> script_controller_;
// TestActivityLogger is owned by a static table within V8DOMActivityLogger
// and should be alive as long as not overwritten.
TestActivityLogger* activity_logger_;
};
TEST_F(ActivityLoggerTest, EventHandler) {
const char* code =
"document.body.innerHTML = '<a onclick=\\\'do()\\\'>test</a>';"
"document.body.onchange = function(){};"
"document.body.setAttribute('onfocus', 'fnc()');"
"document.body.addEventListener('onload', function(){});";
const char* expected_activities =
"blinkAddEventListener | A | click\n"
"blinkAddElement | a | \n"
"blinkAddEventListener | BODY | change\n"
"blinkAddEventListener | DOMWindow | focus\n"
"blinkAddEventListener | BODY | onload";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, ScriptElement) {
const char* code =
"document.body.innerHTML = '<script "
"src=\\\'data:text/javascript;charset=utf-8,\\\'></script>';"
"document.body.innerHTML = '<script>console.log(\\\'test\\\')</script>';"
"var script = document.createElement('script');"
"document.body.appendChild(script);"
"script = document.createElement('script');"
"script.src = 'data:text/javascript;charset=utf-8,';"
"document.body.appendChild(script);"
"document.write('<body><script "
"src=\\\'data:text/javascript;charset=utf-8,\\\'></script></body>');"
"document.close();";
const char* expected_activities =
"blinkAddElement | script | data:text/javascript;charset=utf-8,\n"
"blinkAddElement | script | \n"
"blinkAddElement | script | \n"
"blinkAddElement | script | data:text/javascript;charset=utf-8,\n"
"blinkRequestResource | Script | data:text/javascript;charset=utf-8,\n"
"blinkAddElement | script | data:text/javascript;charset=utf-8,\n"
"blinkRequestResource | Script | data:text/javascript;charset=utf-8,";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, IFrameElement) {
const char* code =
"document.body.innerHTML = '<iframe "
"src=\\\'data:text/html;charset=utf-8,\\\'></iframe>';"
"document.body.innerHTML = '<iframe></iframe>';"
"var iframe = document.createElement('iframe');"
"document.body.appendChild(iframe);"
"iframe = document.createElement('iframe');"
"iframe.src = 'data:text/html;charset=utf-8,';"
"document.body.appendChild(iframe);"
"document.write('<body><iframe "
"src=\\\'data:text/html;charset=utf-8,\\\'></iframe></body>');"
"document.close();";
const char* expected_activities =
"blinkAddElement | iframe | data:text/html;charset=utf-8,\n"
"blinkRequestResource | Main resource | data:text/html;charset=utf-8,\n"
"blinkAddElement | iframe | \n"
"blinkAddElement | iframe | \n"
"blinkAddElement | iframe | data:text/html;charset=utf-8,\n"
"blinkRequestResource | Main resource | data:text/html;charset=utf-8,\n"
"blinkAddElement | iframe | data:text/html;charset=utf-8,\n"
"blinkRequestResource | Main resource | data:text/html;charset=utf-8,";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, AnchorElement) {
const char* code =
"document.body.innerHTML = '<a "
"href=\\\'data:text/css;charset=utf-8,\\\'></a>';"
"document.body.innerHTML = '<a></a>';"
"var a = document.createElement('a');"
"document.body.appendChild(a);"
"a = document.createElement('a');"
"a.href = 'data:text/css;charset=utf-8,';"
"document.body.appendChild(a);"
"document.write('<body><a "
"href=\\\'data:text/css;charset=utf-8,\\\'></a></body>');"
"document.close();";
const char* expected_activities =
"blinkAddElement | a | data:text/css;charset=utf-8,\n"
"blinkAddElement | a | \n"
"blinkAddElement | a | \n"
"blinkAddElement | a | data:text/css;charset=utf-8,\n"
"blinkAddElement | a | data:text/css;charset=utf-8,";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, LinkElement) {
const char* code =
"document.body.innerHTML = '<link rel=\\\'stylesheet\\\' "
"href=\\\'data:text/css;charset=utf-8,\\\'></link>';"
"document.body.innerHTML = '<link></link>';"
"var link = document.createElement('link');"
"document.body.appendChild(link);"
"link = document.createElement('link');"
"link.rel = 'stylesheet';"
"link.href = 'data:text/css;charset=utf-8,';"
"document.body.appendChild(link);"
"document.write('<body><link rel=\\\'stylesheet\\\' "
"href=\\\'data:text/css;charset=utf-8,\\\'></link></body>');"
"document.close();";
const char* expected_activities =
"blinkAddElement | link | stylesheet | data:text/css;charset=utf-8,\n"
"blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,\n"
"blinkAddElement | link | | \n"
"blinkAddElement | link | | \n"
"blinkAddElement | link | stylesheet | data:text/css;charset=utf-8,\n"
"blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,\n"
"blinkAddElement | link | stylesheet | data:text/css;charset=utf-8,\n"
"blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, InputElement) {
const char* code =
"document.body.innerHTML = '<input type=\\\'submit\\\' "
"formaction=\\\'data:text/html;charset=utf-8,\\\'></input>';"
"document.body.innerHTML = '<input></input>';"
"var input = document.createElement('input');"
"document.body.appendChild(input);"
"input = document.createElement('input');"
"input.type = 'submit';"
"input.formAction = 'data:text/html;charset=utf-8,';"
"document.body.appendChild(input);"
"document.write('<body><input type=\\\'submit\\\' "
"formaction=\\\'data:text/html;charset=utf-8,\\\'></input></body>');"
"document.close();";
const char* expected_activities =
"blinkAddElement | input | submit | data:text/html;charset=utf-8,\n"
"blinkAddElement | input | | \n"
"blinkAddElement | input | | \n"
"blinkAddElement | input | submit | data:text/html;charset=utf-8,\n"
"blinkAddElement | input | submit | data:text/html;charset=utf-8,";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, ButtonElement) {
const char* code =
"document.body.innerHTML = '<button type=\\\'submit\\\' "
"formmethod=\\\'post\\\' "
"formaction=\\\'data:text/html;charset=utf-8,\\\'></input>';"
"document.body.innerHTML = '<button></button>';"
"var button = document.createElement('button');"
"document.body.appendChild(button);"
"button = document.createElement('button');"
"button.type = 'submit';"
"button.formMethod = 'post';"
"button.formAction = 'data:text/html;charset=utf-8,';"
"document.body.appendChild(button);"
"document.write('<body><button type=\\\'submit\\\' "
"formmethod=\\\'post\\\' "
"formaction=\\\'data:text/html;charset=utf-8,\\\'></button></body>');"
"document.close();";
const char* expected_activities =
"blinkAddElement | button | submit | post | "
"data:text/html;charset=utf-8,\n"
"blinkAddElement | button | | | \n"
"blinkAddElement | button | | | \n"
"blinkAddElement | button | submit | post | "
"data:text/html;charset=utf-8,\n"
"blinkAddElement | button | submit | post | "
"data:text/html;charset=utf-8,";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, FormElement) {
const char* code =
"document.body.innerHTML = '<form method=\\\'post\\\' "
"action=\\\'data:text/html;charset=utf-8,\\\'></form>';"
"document.body.innerHTML = '<form></form>';"
"var form = document.createElement('form');"
"document.body.appendChild(form);"
"form = document.createElement('form');"
"form.method = 'post';"
"form.action = 'data:text/html;charset=utf-8,';"
"document.body.appendChild(form);"
"document.write('<body><form method=\\\'post\\\' "
"action=\\\'data:text/html;charset=utf-8,\\\'></form></body>');"
"document.close();";
const char* expected_activities =
"blinkAddElement | form | post | data:text/html;charset=utf-8,\n"
"blinkAddElement | form | | \n"
"blinkAddElement | form | | \n"
"blinkAddElement | form | post | data:text/html;charset=utf-8,\n"
"blinkAddElement | form | post | data:text/html;charset=utf-8,";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, ScriptSrcAttribute) {
const char* code =
"document.open();"
"document.write('<script "
"src=\\\'data:text/javascript;charset=utf-8,A\\\'></script>');"
"document.close();"
"var script = document.getElementsByTagName('script')[0];"
"script.src = 'data:text/javascript;charset=utf-8,B';"
"script.setAttribute('src', 'data:text/javascript;charset=utf-8,C');"
"script.setAttributeNS('', 'src', "
"'data:text/javascript;charset=utf-8,D');"
"var attr = document.createAttribute('src');"
"attr.value = 'data:text/javascript;charset=utf-8,E';"
"script.setAttributeNode(attr);";
const char* expected_activities =
"blinkAddElement | script | data:text/javascript;charset=utf-8,A\n"
"blinkRequestResource | Script | data:text/javascript;charset=utf-8,A\n"
"blinkSetAttribute | script | src | data:text/javascript;charset=utf-8,A "
"| data:text/javascript;charset=utf-8,B\n"
"blinkSetAttribute | script | src | data:text/javascript;charset=utf-8,B "
"| data:text/javascript;charset=utf-8,C\n"
"blinkSetAttribute | script | src | data:text/javascript;charset=utf-8,C "
"| data:text/javascript;charset=utf-8,D\n"
"blinkSetAttribute | script | src | data:text/javascript;charset=utf-8,D "
"| data:text/javascript;charset=utf-8,E";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, IFrameSrcAttribute) {
const char* code =
"document.body.innerHTML = '<iframe "
"src=\\\'data:text/html;charset=utf-8,A\\\'></iframe>';"
"var iframe = document.getElementsByTagName('iframe')[0];"
"iframe.src = 'data:text/html;charset=utf-8,B';"
"iframe.setAttribute('src', 'data:text/html;charset=utf-8,C');"
"iframe.setAttributeNS('', 'src', 'data:text/html;charset=utf-8,D');"
"var attr = document.createAttribute('src');"
"attr.value = 'data:text/html;charset=utf-8,E';"
"iframe.setAttributeNode(attr);";
const char* expected_activities =
"blinkAddElement | iframe | data:text/html;charset=utf-8,A\n"
"blinkRequestResource | Main resource | data:text/html;charset=utf-8,A\n"
"blinkSetAttribute | iframe | src | data:text/html;charset=utf-8,A | "
"data:text/html;charset=utf-8,B\n"
"blinkSetAttribute | iframe | src | data:text/html;charset=utf-8,B | "
"data:text/html;charset=utf-8,C\n"
"blinkSetAttribute | iframe | src | data:text/html;charset=utf-8,C | "
"data:text/html;charset=utf-8,D\n"
"blinkSetAttribute | iframe | src | data:text/html;charset=utf-8,D | "
"data:text/html;charset=utf-8,E";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, AnchorHrefAttribute) {
const char* code =
"document.body.innerHTML = '<a "
"href=\\\'data:text/html;charset=utf-8,A\\\'></a>';"
"var a = document.getElementsByTagName('a')[0];"
"a.href = 'data:text/html;charset=utf-8,B';"
"a.setAttribute('href', 'data:text/html;charset=utf-8,C');"
"a.setAttributeNS('', 'href', 'data:text/html;charset=utf-8,D');"
"var attr = document.createAttribute('href');"
"attr.value = 'data:text/html;charset=utf-8,E';"
"a.setAttributeNode(attr);";
const char* expected_activities =
"blinkAddElement | a | data:text/html;charset=utf-8,A\n"
"blinkSetAttribute | a | href | data:text/html;charset=utf-8,A | "
"data:text/html;charset=utf-8,B\n"
"blinkSetAttribute | a | href | data:text/html;charset=utf-8,B | "
"data:text/html;charset=utf-8,C\n"
"blinkSetAttribute | a | href | data:text/html;charset=utf-8,C | "
"data:text/html;charset=utf-8,D\n"
"blinkSetAttribute | a | href | data:text/html;charset=utf-8,D | "
"data:text/html;charset=utf-8,E";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, LinkHrefAttribute) {
const char* code =
"document.body.innerHTML = '<link rel=\\\'stylesheet\\\' "
"href=\\\'data:text/css;charset=utf-8,A\\\'></link>';"
"var link = document.getElementsByTagName('link')[0];"
"link.href = 'data:text/css;charset=utf-8,B';"
"link.setAttribute('href', 'data:text/css;charset=utf-8,C');"
"link.setAttributeNS('', 'href', 'data:text/css;charset=utf-8,D');"
"var attr = document.createAttribute('href');"
"attr.value = 'data:text/css;charset=utf-8,E';"
"link.setAttributeNode(attr);";
const char* expected_activities =
"blinkAddElement | link | stylesheet | data:text/css;charset=utf-8,A\n"
"blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,A\n"
"blinkSetAttribute | link | href | data:text/css;charset=utf-8,A | "
"data:text/css;charset=utf-8,B\n"
"blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,B\n"
"blinkSetAttribute | link | href | data:text/css;charset=utf-8,B | "
"data:text/css;charset=utf-8,C\n"
"blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,C\n"
"blinkSetAttribute | link | href | data:text/css;charset=utf-8,C | "
"data:text/css;charset=utf-8,D\n"
"blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,D\n"
"blinkSetAttribute | link | href | data:text/css;charset=utf-8,D | "
"data:text/css;charset=utf-8,E\n"
"blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,E";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, InputFormActionAttribute) {
const char* code =
"document.body.innerHTML = '<input type=\\\'button\\\' "
"formaction=\\\'data:text/html;charset=utf-8,A\\\'></input>';"
"var input = document.getElementsByTagName('input')[0];"
"input.formAction = 'data:text/html;charset=utf-8,B';"
"input.setAttribute('formaction', 'data:text/html;charset=utf-8,C');"
"input.setAttributeNS('', 'formaction', "
"'data:text/html;charset=utf-8,D');"
"var attr = document.createAttribute('formaction');"
"attr.value = 'data:text/html;charset=utf-8,E';"
"input.setAttributeNode(attr);";
const char* expected_activities =
"blinkAddElement | input | button | data:text/html;charset=utf-8,A\n"
"blinkSetAttribute | input | formaction | data:text/html;charset=utf-8,A "
"| data:text/html;charset=utf-8,B\n"
"blinkSetAttribute | input | formaction | data:text/html;charset=utf-8,B "
"| data:text/html;charset=utf-8,C\n"
"blinkSetAttribute | input | formaction | data:text/html;charset=utf-8,C "
"| data:text/html;charset=utf-8,D\n"
"blinkSetAttribute | input | formaction | data:text/html;charset=utf-8,D "
"| data:text/html;charset=utf-8,E";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, ButtonFormActionAttribute) {
const char* code =
"document.body.innerHTML = '<button type=\\\'submit\\\' "
"formmethod=\\\'post\\\' "
"formaction=\\\'data:text/html;charset=utf-8,A\\\'></input>';"
"var button = document.getElementsByTagName('button')[0];"
"button.formAction = 'data:text/html;charset=utf-8,B';"
"button.setAttribute('formaction', 'data:text/html;charset=utf-8,C');"
"button.setAttributeNS('', 'formaction', "
"'data:text/html;charset=utf-8,D');"
"var attr = document.createAttribute('formaction');"
"attr.value = 'data:text/html;charset=utf-8,E';"
"button.setAttributeNode(attr);";
const char* expected_activities =
"blinkAddElement | button | submit | post | "
"data:text/html;charset=utf-8,A\n"
"blinkSetAttribute | button | formaction | "
"data:text/html;charset=utf-8,A | data:text/html;charset=utf-8,B\n"
"blinkSetAttribute | button | formaction | "
"data:text/html;charset=utf-8,B | data:text/html;charset=utf-8,C\n"
"blinkSetAttribute | button | formaction | "
"data:text/html;charset=utf-8,C | data:text/html;charset=utf-8,D\n"
"blinkSetAttribute | button | formaction | "
"data:text/html;charset=utf-8,D | data:text/html;charset=utf-8,E";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, FormActionAttribute) {
const char* code =
"document.body.innerHTML = '<form "
"action=\\\'data:text/html;charset=utf-8,A\\\'></form>';"
"var form = document.getElementsByTagName('form')[0];"
"form.action = 'data:text/html;charset=utf-8,B';"
"form.setAttribute('action', 'data:text/html;charset=utf-8,C');"
"form.setAttributeNS('', 'action', 'data:text/html;charset=utf-8,D');"
"var attr = document.createAttribute('action');"
"attr.value = 'data:text/html;charset=utf-8,E';"
"form.setAttributeNode(attr);";
const char* expected_activities =
"blinkAddElement | form | | data:text/html;charset=utf-8,A\n"
"blinkSetAttribute | form | action | data:text/html;charset=utf-8,A | "
"data:text/html;charset=utf-8,B\n"
"blinkSetAttribute | form | action | data:text/html;charset=utf-8,B | "
"data:text/html;charset=utf-8,C\n"
"blinkSetAttribute | form | action | data:text/html;charset=utf-8,C | "
"data:text/html;charset=utf-8,D\n"
"blinkSetAttribute | form | action | data:text/html;charset=utf-8,D | "
"data:text/html;charset=utf-8,E";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, LocalDOMWindowAttribute) {
const char* code =
"location.href = 'data:text/html;charset=utf-8,A';"
"location.assign('data:text/html;charset=utf-8,B');"
"location.replace('data:text/html;charset=utf-8,C');"
"location.protocol = 'protocol';"
"location.pathname = 'pathname';"
"location.search = 'search';"
"location.hash = 'hash';"
"location.href = 'about:blank';";
const char* expected_activities =
"blinkSetAttribute | LocalDOMWindow | url | about:blank | "
"data:text/html;charset=utf-8,A\n"
"blinkSetAttribute | LocalDOMWindow | url | about:blank | "
"data:text/html;charset=utf-8,B\n"
"blinkSetAttribute | LocalDOMWindow | url | about:blank | "
"data:text/html;charset=utf-8,C\n"
"blinkSetAttribute | LocalDOMWindow | url | about:blank | "
"protocol:blank\n"
"blinkSetAttribute | LocalDOMWindow | url | about:blank | "
"about:pathname\n"
"blinkSetAttribute | LocalDOMWindow | url | about:blank | "
"about:blank?search\n"
"blinkSetAttribute | LocalDOMWindow | url | about:blank | "
"about:blank#hash\n"
"blinkSetAttribute | LocalDOMWindow | url | about:blank#hash | "
"about:blank\n";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
TEST_F(ActivityLoggerTest, RequestResource) {
const char* code =
"document.write('<iframe "
"src=\\\'data:text/html;charset=utf-8,A\\\'></iframe>');"
"document.write('<img "
"src=\\\'data:text/html;charset=utf-8,B\\\'></img>');"
"document.write('<link rel=\\\'stylesheet\\\' "
"href=\\\'data:text/html;charset=utf-8,C\\\'></link>');"
"document.write('<script "
"src=\\\'data:text/html;charset=utf-8,D\\\'></script>');"
"document.close();"
"var xhr = new XMLHttpRequest(); xhr.open('GET', "
"'data:text/html;charset=utf-8,E'); xhr.send();";
const char* expected_activities =
"blinkAddElement | iframe | data:text/html;charset=utf-8,A\n"
"blinkRequestResource | Main resource | data:text/html;charset=utf-8,A\n"
"blinkAddElement | link | stylesheet | data:text/html;charset=utf-8,C\n"
"blinkRequestResource | CSS stylesheet | data:text/html;charset=utf-8,C\n"
"blinkAddElement | script | data:text/html;charset=utf-8,D\n"
"blinkRequestResource | Script | data:text/html;charset=utf-8,D\n"
"blinkRequestResource | XMLHttpRequest | data:text/html;charset=utf-8,E\n"
"blinkRequestResource | Image | data:text/html;charset=utf-8,B\n";
ExecuteScriptInMainWorld(code);
ASSERT_TRUE(VerifyActivities(""));
ExecuteScriptInIsolatedWorld(code);
ASSERT_TRUE(VerifyActivities(expected_activities));
}
} // namespace blink