1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "config.h" 6 7 #include "FrameTestHelpers.h" 8 #include "bindings/core/v8/ScriptController.h" 9 #include "bindings/core/v8/V8Binding.h" 10 #include "bindings/core/v8/V8DOMActivityLogger.h" 11 #include "web/WebLocalFrameImpl.h" 12 #include "wtf/Forward.h" 13 #include "wtf/text/Base64.h" 14 #include <gtest/gtest.h> 15 #include <v8.h> 16 17 namespace { 18 19 using blink::FrameTestHelpers::WebViewHelper; 20 using blink::FrameTestHelpers::pumpPendingRequestsDoNotUse; 21 using namespace blink; 22 23 class TestActivityLogger : public V8DOMActivityLogger { 24 public: 25 virtual ~TestActivityLogger() { } 26 27 void logGetter(const String& apiName) OVERRIDE 28 { 29 m_loggedActivities.append(apiName); 30 } 31 32 void logSetter(const String& apiName, const v8::Handle<v8::Value>& newValue) OVERRIDE 33 { 34 m_loggedActivities.append(apiName + " | " + toCoreStringWithUndefinedOrNullCheck(newValue)); 35 } 36 37 void logMethod(const String& apiName, int argc, const v8::Handle<v8::Value>* argv) OVERRIDE 38 { 39 String activityString = apiName; 40 for (int i = 0; i < argc; i++) 41 activityString = activityString + " | " + toCoreStringWithUndefinedOrNullCheck(argv[i]); 42 m_loggedActivities.append(activityString); 43 } 44 45 void logEvent(const String& eventName, int argc, const String* argv) OVERRIDE 46 { 47 String activityString = eventName; 48 for (int i = 0; i < argc; i++) { 49 activityString = activityString + " | " + argv[i]; 50 } 51 m_loggedActivities.append(activityString); 52 } 53 54 void clear() { m_loggedActivities.clear(); } 55 bool verifyActivities(const Vector<String>& activities) const { return m_loggedActivities == activities; } 56 57 private: 58 Vector<String> m_loggedActivities; 59 }; 60 61 class ActivityLoggerTest : public testing::Test { 62 protected: 63 ActivityLoggerTest() 64 { 65 m_activityLogger = new TestActivityLogger(); 66 V8DOMActivityLogger::setActivityLogger(isolatedWorldId, String(), adoptPtr(m_activityLogger)); 67 m_webViewHelper.initialize(true); 68 m_scriptController = &m_webViewHelper.webViewImpl()->mainFrameImpl()->frame()->script(); 69 } 70 71 void executeScriptInMainWorld(const String& script) const 72 { 73 v8::HandleScope scope(v8::Isolate::GetCurrent()); 74 m_scriptController->executeScriptInMainWorld(script); 75 pumpPendingRequestsDoNotUse(m_webViewHelper.webViewImpl()->mainFrame()); 76 } 77 78 void executeScriptInIsolatedWorld(const String& script) const 79 { 80 v8::HandleScope scope(v8::Isolate::GetCurrent()); 81 Vector<ScriptSourceCode> sources; 82 sources.append(ScriptSourceCode(script)); 83 Vector<v8::Local<v8::Value> > results; 84 m_scriptController->executeScriptInIsolatedWorld(isolatedWorldId, sources, extensionGroup, 0); 85 pumpPendingRequestsDoNotUse(m_webViewHelper.webViewImpl()->mainFrame()); 86 } 87 88 bool verifyActivities(const String& activities) 89 { 90 Vector<String> activityVector; 91 activities.split("\n", activityVector); 92 return m_activityLogger->verifyActivities(activityVector); 93 } 94 95 private: 96 static const int isolatedWorldId = 1; 97 static const int extensionGroup = 0; 98 99 WebViewHelper m_webViewHelper; 100 ScriptController* m_scriptController; 101 // TestActivityLogger is owned by a static table within V8DOMActivityLogger 102 // and should be alive as long as not overwritten. 103 TestActivityLogger* m_activityLogger; 104 }; 105 106 TEST_F(ActivityLoggerTest, EventHandler) 107 { 108 const char* code = 109 "document.body.innerHTML = '<a onclick=\\\'do()\\\'>test</a>';" 110 "document.body.onchange = function(){};" 111 "document.body.setAttribute('onfocus', 'fnc()');" 112 "document.body.addEventListener('onload', function(){});"; 113 const char* expectedActivities = 114 "blinkAddEventListener | A | click\n" 115 "blinkAddElement | a | \n" 116 "blinkAddEventListener | BODY | change\n" 117 "blinkAddEventListener | LocalDOMWindow | focus\n" 118 "blinkAddEventListener | BODY | onload"; 119 executeScriptInMainWorld(code); 120 ASSERT_TRUE(verifyActivities("")); 121 executeScriptInIsolatedWorld(code); 122 ASSERT_TRUE(verifyActivities(expectedActivities)); 123 } 124 125 TEST_F(ActivityLoggerTest, ScriptElement) 126 { 127 const char* code = 128 "document.body.innerHTML = '<script src=\\\'data:text/html;charset=utf-8,\\\'></script>';" 129 "document.body.innerHTML = '<script>console.log(\\\'test\\\')</script>';" 130 "var script = document.createElement('script');" 131 "document.body.appendChild(script);" 132 "script = document.createElement('script');" 133 "script.src = 'data:text/html;charset=utf-8,';" 134 "document.body.appendChild(script);" 135 "document.write('<body><script src=\\\'data:text/html;charset=utf-8,\\\'></script></body>');"; 136 const char* expectedActivities = 137 "blinkAddElement | script | data:text/html;charset=utf-8,\n" 138 "blinkAddElement | script | \n" 139 "blinkAddElement | script | \n" 140 "blinkAddElement | script | data:text/html;charset=utf-8,\n" 141 "blinkRequestResource | Script | data:text/html;charset=utf-8,\n" 142 "blinkAddElement | script | data:text/html;charset=utf-8,\n" 143 "blinkRequestResource | Script | data:text/html;charset=utf-8,"; 144 executeScriptInMainWorld(code); 145 ASSERT_TRUE(verifyActivities("")); 146 executeScriptInIsolatedWorld(code); 147 ASSERT_TRUE(verifyActivities(expectedActivities)); 148 } 149 150 TEST_F(ActivityLoggerTest, IFrameElement) 151 { 152 const char* code = 153 "document.body.innerHTML = '<iframe src=\\\'data:text/html;charset=utf-8,\\\'></iframe>';" 154 "document.body.innerHTML = '<iframe></iframe>';" 155 "var iframe = document.createElement('iframe');" 156 "document.body.appendChild(iframe);" 157 "iframe = document.createElement('iframe');" 158 "iframe.src = 'data:text/html;charset=utf-8,';" 159 "document.body.appendChild(iframe);" 160 "document.write('<body><iframe src=\\\'data:text/html;charset=utf-8,\\\'></iframe></body>');"; 161 const char* expectedActivities = 162 "blinkAddElement | iframe | data:text/html;charset=utf-8,\n" 163 "blinkRequestResource | Main resource | data:text/html;charset=utf-8,\n" 164 "blinkAddElement | iframe | \n" 165 "blinkAddElement | iframe | \n" 166 "blinkAddElement | iframe | data:text/html;charset=utf-8,\n" 167 "blinkRequestResource | Main resource | data:text/html;charset=utf-8,\n" 168 "blinkAddElement | iframe | data:text/html;charset=utf-8,\n" 169 "blinkRequestResource | Main resource | data:text/html;charset=utf-8,"; 170 executeScriptInMainWorld(code); 171 ASSERT_TRUE(verifyActivities("")); 172 executeScriptInIsolatedWorld(code); 173 ASSERT_TRUE(verifyActivities(expectedActivities)); 174 } 175 176 TEST_F(ActivityLoggerTest, AnchorElement) 177 { 178 const char* code = 179 "document.body.innerHTML = '<a href=\\\'data:text/css;charset=utf-8,\\\'></a>';" 180 "document.body.innerHTML = '<a></a>';" 181 "var a = document.createElement('a');" 182 "document.body.appendChild(a);" 183 "a = document.createElement('a');" 184 "a.href = 'data:text/css;charset=utf-8,';" 185 "document.body.appendChild(a);" 186 "document.write('<body><a href=\\\'data:text/css;charset=utf-8,\\\'></a></body>');"; 187 const char* expectedActivities = 188 "blinkAddElement | a | data:text/css;charset=utf-8,\n" 189 "blinkAddElement | a | \n" 190 "blinkAddElement | a | \n" 191 "blinkAddElement | a | data:text/css;charset=utf-8,\n" 192 "blinkAddElement | a | data:text/css;charset=utf-8,"; 193 executeScriptInMainWorld(code); 194 ASSERT_TRUE(verifyActivities("")); 195 executeScriptInIsolatedWorld(code); 196 ASSERT_TRUE(verifyActivities(expectedActivities)); 197 } 198 199 TEST_F(ActivityLoggerTest, LinkElement) 200 { 201 const char* code = 202 "document.body.innerHTML = '<link rel=\\\'stylesheet\\\' href=\\\'data:text/css;charset=utf-8,\\\'></link>';" 203 "document.body.innerHTML = '<link></link>';" 204 "var link = document.createElement('link');" 205 "document.body.appendChild(link);" 206 "link = document.createElement('link');" 207 "link.rel = 'stylesheet';" 208 "link.href = 'data:text/css;charset=utf-8,';" 209 "document.body.appendChild(link);" 210 "document.write('<body><link rel=\\\'stylesheet\\\' href=\\\'data:text/css;charset=utf-8,\\\'></link></body>');"; 211 const char* expectedActivities = 212 "blinkAddElement | link | stylesheet | data:text/css;charset=utf-8,\n" 213 "blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,\n" 214 "blinkAddElement | link | | \n" 215 "blinkAddElement | link | | \n" 216 "blinkAddElement | link | stylesheet | data:text/css;charset=utf-8,\n" 217 "blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,\n" 218 "blinkAddElement | link | stylesheet | data:text/css;charset=utf-8,\n" 219 "blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,"; 220 executeScriptInMainWorld(code); 221 ASSERT_TRUE(verifyActivities("")); 222 executeScriptInIsolatedWorld(code); 223 ASSERT_TRUE(verifyActivities(expectedActivities)); 224 } 225 226 TEST_F(ActivityLoggerTest, InputElement) 227 { 228 const char* code = 229 "document.body.innerHTML = '<input type=\\\'submit\\\' formaction=\\\'data:text/html;charset=utf-8,\\\'></input>';" 230 "document.body.innerHTML = '<input></input>';" 231 "var input = document.createElement('input');" 232 "document.body.appendChild(input);" 233 "input = document.createElement('input');" 234 "input.type = 'submit';" 235 "input.formAction = 'data:text/html;charset=utf-8,';" 236 "document.body.appendChild(input);" 237 "document.write('<body><input type=\\\'submit\\\' formaction=\\\'data:text/html;charset=utf-8,\\\'></input></body>');"; 238 const char* expectedActivities = 239 "blinkAddElement | input | submit | data:text/html;charset=utf-8,\n" 240 "blinkAddElement | input | | \n" 241 "blinkAddElement | input | | \n" 242 "blinkAddElement | input | submit | data:text/html;charset=utf-8,\n" 243 "blinkAddElement | input | submit | data:text/html;charset=utf-8,"; 244 executeScriptInMainWorld(code); 245 ASSERT_TRUE(verifyActivities("")); 246 executeScriptInIsolatedWorld(code); 247 ASSERT_TRUE(verifyActivities(expectedActivities)); 248 } 249 250 TEST_F(ActivityLoggerTest, ButtonElement) 251 { 252 const char* code = 253 "document.body.innerHTML = '<button type=\\\'submit\\\' formmethod=\\\'post\\\' formaction=\\\'data:text/html;charset=utf-8,\\\'></input>';" 254 "document.body.innerHTML = '<button></button>';" 255 "var button = document.createElement('button');" 256 "document.body.appendChild(button);" 257 "button = document.createElement('button');" 258 "button.type = 'submit';" 259 "button.formMethod = 'post';" 260 "button.formAction = 'data:text/html;charset=utf-8,';" 261 "document.body.appendChild(button);" 262 "document.write('<body><button type=\\\'submit\\\' formmethod=\\\'post\\\' formaction=\\\'data:text/html;charset=utf-8,\\\'></button></body>');"; 263 const char* expectedActivities = 264 "blinkAddElement | button | submit | post | data:text/html;charset=utf-8,\n" 265 "blinkAddElement | button | | | \n" 266 "blinkAddElement | button | | | \n" 267 "blinkAddElement | button | submit | post | data:text/html;charset=utf-8,\n" 268 "blinkAddElement | button | submit | post | data:text/html;charset=utf-8,"; 269 executeScriptInMainWorld(code); 270 ASSERT_TRUE(verifyActivities("")); 271 executeScriptInIsolatedWorld(code); 272 ASSERT_TRUE(verifyActivities(expectedActivities)); 273 } 274 275 TEST_F(ActivityLoggerTest, FormElement) 276 { 277 const char* code = 278 "document.body.innerHTML = '<form method=\\\'post\\\' action=\\\'data:text/html;charset=utf-8,\\\'></form>';" 279 "document.body.innerHTML = '<form></form>';" 280 "var form = document.createElement('form');" 281 "document.body.appendChild(form);" 282 "form = document.createElement('form');" 283 "form.method = 'post';" 284 "form.action = 'data:text/html;charset=utf-8,';" 285 "document.body.appendChild(form);" 286 "document.write('<body><form method=\\\'post\\\' action=\\\'data:text/html;charset=utf-8,\\\'></form></body>');"; 287 const char* expectedActivities = 288 "blinkAddElement | form | post | data:text/html;charset=utf-8,\n" 289 "blinkAddElement | form | | \n" 290 "blinkAddElement | form | | \n" 291 "blinkAddElement | form | post | data:text/html;charset=utf-8,\n" 292 "blinkAddElement | form | post | data:text/html;charset=utf-8,"; 293 executeScriptInMainWorld(code); 294 ASSERT_TRUE(verifyActivities("")); 295 executeScriptInIsolatedWorld(code); 296 ASSERT_TRUE(verifyActivities(expectedActivities)); 297 } 298 299 TEST_F(ActivityLoggerTest, IFrameSrcAttribute) 300 { 301 const char* code = 302 "document.body.innerHTML = '<iframe src=\\\'data:text/html;charset=utf-8,A\\\'></iframe>';" 303 "var iframe = document.getElementsByTagName('iframe')[0];" 304 "iframe.src = 'data:text/html;charset=utf-8,B';" 305 "iframe.setAttribute('src', 'data:text/html;charset=utf-8,C');" 306 "iframe.setAttributeNS('', 'src', 'data:text/html;charset=utf-8,D');" 307 "var attr = document.createAttribute('src');" 308 "attr.value = 'data:text/html;charset=utf-8,E';" 309 "iframe.setAttributeNode(attr);"; 310 const char* expectedActivities = 311 "blinkAddElement | iframe | data:text/html;charset=utf-8,A\n" 312 "blinkRequestResource | Main resource | data:text/html;charset=utf-8,A\n" 313 "blinkSetAttribute | iframe | src | data:text/html;charset=utf-8,A | data:text/html;charset=utf-8,B\n" 314 "blinkSetAttribute | iframe | src | data:text/html;charset=utf-8,B | data:text/html;charset=utf-8,C\n" 315 "blinkSetAttribute | iframe | src | data:text/html;charset=utf-8,C | data:text/html;charset=utf-8,D\n" 316 "blinkSetAttribute | iframe | src | data:text/html;charset=utf-8,D | data:text/html;charset=utf-8,E"; 317 executeScriptInMainWorld(code); 318 ASSERT_TRUE(verifyActivities("")); 319 executeScriptInIsolatedWorld(code); 320 ASSERT_TRUE(verifyActivities(expectedActivities)); 321 } 322 323 TEST_F(ActivityLoggerTest, AnchorHrefAttribute) 324 { 325 const char* code = 326 "document.body.innerHTML = '<a href=\\\'data:text/html;charset=utf-8,A\\\'></a>';" 327 "var a = document.getElementsByTagName('a')[0];" 328 "a.href = 'data:text/html;charset=utf-8,B';" 329 "a.setAttribute('href', 'data:text/html;charset=utf-8,C');" 330 "a.setAttributeNS('', 'href', 'data:text/html;charset=utf-8,D');" 331 "var attr = document.createAttribute('href');" 332 "attr.value = 'data:text/html;charset=utf-8,E';" 333 "a.setAttributeNode(attr);"; 334 const char* expectedActivities = 335 "blinkAddElement | a | data:text/html;charset=utf-8,A\n" 336 "blinkSetAttribute | a | href | data:text/html;charset=utf-8,A | data:text/html;charset=utf-8,B\n" 337 "blinkSetAttribute | a | href | data:text/html;charset=utf-8,B | data:text/html;charset=utf-8,C\n" 338 "blinkSetAttribute | a | href | data:text/html;charset=utf-8,C | data:text/html;charset=utf-8,D\n" 339 "blinkSetAttribute | a | href | data:text/html;charset=utf-8,D | data:text/html;charset=utf-8,E"; 340 executeScriptInMainWorld(code); 341 ASSERT_TRUE(verifyActivities("")); 342 executeScriptInIsolatedWorld(code); 343 ASSERT_TRUE(verifyActivities(expectedActivities)); 344 } 345 346 TEST_F(ActivityLoggerTest, LinkHrefAttribute) 347 { 348 const char* code = 349 "document.body.innerHTML = '<link rel=\\\'stylesheet\\\' href=\\\'data:text/css;charset=utf-8,A\\\'></link>';" 350 "var link = document.getElementsByTagName('link')[0];" 351 "link.href = 'data:text/css;charset=utf-8,B';" 352 "link.setAttribute('href', 'data:text/css;charset=utf-8,C');" 353 "link.setAttributeNS('', 'href', 'data:text/css;charset=utf-8,D');" 354 "var attr = document.createAttribute('href');" 355 "attr.value = 'data:text/css;charset=utf-8,E';" 356 "link.setAttributeNode(attr);"; 357 const char* expectedActivities = 358 "blinkAddElement | link | stylesheet | data:text/css;charset=utf-8,A\n" 359 "blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,A\n" 360 "blinkSetAttribute | link | href | data:text/css;charset=utf-8,A | data:text/css;charset=utf-8,B\n" 361 "blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,B\n" 362 "blinkSetAttribute | link | href | data:text/css;charset=utf-8,B | data:text/css;charset=utf-8,C\n" 363 "blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,C\n" 364 "blinkSetAttribute | link | href | data:text/css;charset=utf-8,C | data:text/css;charset=utf-8,D\n" 365 "blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,D\n" 366 "blinkSetAttribute | link | href | data:text/css;charset=utf-8,D | data:text/css;charset=utf-8,E\n" 367 "blinkRequestResource | CSS stylesheet | data:text/css;charset=utf-8,E"; 368 executeScriptInMainWorld(code); 369 ASSERT_TRUE(verifyActivities("")); 370 executeScriptInIsolatedWorld(code); 371 ASSERT_TRUE(verifyActivities(expectedActivities)); 372 } 373 374 TEST_F(ActivityLoggerTest, InputFormActionAttribute) 375 { 376 const char* code = 377 "document.body.innerHTML = '<input type=\\\'button\\\' formaction=\\\'data:text/html;charset=utf-8,A\\\'></input>';" 378 "var input = document.getElementsByTagName('input')[0];" 379 "input.formAction = 'data:text/html;charset=utf-8,B';" 380 "input.setAttribute('formaction', 'data:text/html;charset=utf-8,C');" 381 "input.setAttributeNS('', 'formaction', 'data:text/html;charset=utf-8,D');" 382 "var attr = document.createAttribute('formaction');" 383 "attr.value = 'data:text/html;charset=utf-8,E';" 384 "input.setAttributeNode(attr);"; 385 const char* expectedActivities = 386 "blinkAddElement | input | button | data:text/html;charset=utf-8,A\n" 387 "blinkSetAttribute | input | formaction | data:text/html;charset=utf-8,A | data:text/html;charset=utf-8,B\n" 388 "blinkSetAttribute | input | formaction | data:text/html;charset=utf-8,B | data:text/html;charset=utf-8,C\n" 389 "blinkSetAttribute | input | formaction | data:text/html;charset=utf-8,C | data:text/html;charset=utf-8,D\n" 390 "blinkSetAttribute | input | formaction | data:text/html;charset=utf-8,D | data:text/html;charset=utf-8,E"; 391 executeScriptInMainWorld(code); 392 ASSERT_TRUE(verifyActivities("")); 393 executeScriptInIsolatedWorld(code); 394 ASSERT_TRUE(verifyActivities(expectedActivities)); 395 } 396 397 TEST_F(ActivityLoggerTest, ButtonFormActionAttribute) 398 { 399 const char* code = 400 "document.body.innerHTML = '<button type=\\\'submit\\\' formmethod=\\\'post\\\' formaction=\\\'data:text/html;charset=utf-8,A\\\'></input>';" 401 "var button = document.getElementsByTagName('button')[0];" 402 "button.formAction = 'data:text/html;charset=utf-8,B';" 403 "button.setAttribute('formaction', 'data:text/html;charset=utf-8,C');" 404 "button.setAttributeNS('', 'formaction', 'data:text/html;charset=utf-8,D');" 405 "var attr = document.createAttribute('formaction');" 406 "attr.value = 'data:text/html;charset=utf-8,E';" 407 "button.setAttributeNode(attr);"; 408 const char* expectedActivities = 409 "blinkAddElement | button | submit | post | data:text/html;charset=utf-8,A\n" 410 "blinkSetAttribute | button | formaction | data:text/html;charset=utf-8,A | data:text/html;charset=utf-8,B\n" 411 "blinkSetAttribute | button | formaction | data:text/html;charset=utf-8,B | data:text/html;charset=utf-8,C\n" 412 "blinkSetAttribute | button | formaction | data:text/html;charset=utf-8,C | data:text/html;charset=utf-8,D\n" 413 "blinkSetAttribute | button | formaction | data:text/html;charset=utf-8,D | data:text/html;charset=utf-8,E"; 414 executeScriptInMainWorld(code); 415 ASSERT_TRUE(verifyActivities("")); 416 executeScriptInIsolatedWorld(code); 417 ASSERT_TRUE(verifyActivities(expectedActivities)); 418 } 419 420 TEST_F(ActivityLoggerTest, FormActionAttribute) 421 { 422 const char* code = 423 "document.body.innerHTML = '<form action=\\\'data:text/html;charset=utf-8,A\\\'></form>';" 424 "var form = document.getElementsByTagName('form')[0];" 425 "form.action = 'data:text/html;charset=utf-8,B';" 426 "form.setAttribute('action', 'data:text/html;charset=utf-8,C');" 427 "form.setAttributeNS('', 'action', 'data:text/html;charset=utf-8,D');" 428 "var attr = document.createAttribute('action');" 429 "attr.value = 'data:text/html;charset=utf-8,E';" 430 "form.setAttributeNode(attr);"; 431 const char* expectedActivities = 432 "blinkAddElement | form | | data:text/html;charset=utf-8,A\n" 433 "blinkSetAttribute | form | action | data:text/html;charset=utf-8,A | data:text/html;charset=utf-8,B\n" 434 "blinkSetAttribute | form | action | data:text/html;charset=utf-8,B | data:text/html;charset=utf-8,C\n" 435 "blinkSetAttribute | form | action | data:text/html;charset=utf-8,C | data:text/html;charset=utf-8,D\n" 436 "blinkSetAttribute | form | action | data:text/html;charset=utf-8,D | data:text/html;charset=utf-8,E"; 437 executeScriptInMainWorld(code); 438 ASSERT_TRUE(verifyActivities("")); 439 executeScriptInIsolatedWorld(code); 440 ASSERT_TRUE(verifyActivities(expectedActivities)); 441 } 442 443 TEST_F(ActivityLoggerTest, LocalDOMWindowAttribute) 444 { 445 const char* code = 446 "location.href = 'data:text/html;charset=utf-8,A';" 447 "location.assign('data:text/html;charset=utf-8,B');" 448 "location.replace('data:text/html;charset=utf-8,C');" 449 "location.protocol = 'protocol';" 450 "location.pathname = 'pathname';" 451 "location.search = 'search';" 452 "location.hash = 'hash';" 453 "location.href = 'about:blank';"; 454 const char* expectedActivities = 455 "blinkSetAttribute | LocalDOMWindow | url | about:blank | data:text/html;charset=utf-8,A\n" 456 "blinkSetAttribute | LocalDOMWindow | url | about:blank | data:text/html;charset=utf-8,B\n" 457 "blinkSetAttribute | LocalDOMWindow | url | about:blank | data:text/html;charset=utf-8,C\n" 458 "blinkSetAttribute | LocalDOMWindow | url | about:blank | protocol:blank\n" 459 "blinkSetAttribute | LocalDOMWindow | url | about:blank | about:pathname\n" 460 "blinkSetAttribute | LocalDOMWindow | url | about:blank | about:blank?search\n" 461 "blinkSetAttribute | LocalDOMWindow | url | about:blank | about:blank#hash\n" 462 "blinkSetAttribute | LocalDOMWindow | url | about:blank#hash | about:blank\n"; 463 executeScriptInMainWorld(code); 464 ASSERT_TRUE(verifyActivities("")); 465 executeScriptInIsolatedWorld(code); 466 ASSERT_TRUE(verifyActivities(expectedActivities)); 467 } 468 469 TEST_F(ActivityLoggerTest, RequestResource) 470 { 471 const char* code = 472 "document.write('<iframe src=\\\'data:text/html;charset=utf-8,A\\\'></iframe>');" 473 "document.write('<img src=\\\'data:text/html;charset=utf-8,B\\\'></img>');" 474 "document.write('<link rel=\\\'stylesheet\\\' href=\\\'data:text/html;charset=utf-8,C\\\'></link>');" 475 "document.write('<script src=\\\'data:text/html;charset=utf-8,D\\\'></script>');" 476 "var xhr = new XMLHttpRequest(); xhr.open('GET', 'data:text/html;charset=utf-8,E'); xhr.send();"; 477 const char* expectedActivities = 478 "blinkAddElement | iframe | data:text/html;charset=utf-8,A\n" 479 "blinkRequestResource | Main resource | data:text/html;charset=utf-8,A\n" 480 "blinkRequestResource | Image | data:text/html;charset=utf-8,B\n" 481 "blinkAddElement | link | stylesheet | data:text/html;charset=utf-8,C\n" 482 "blinkRequestResource | CSS stylesheet | data:text/html;charset=utf-8,C\n" 483 "blinkAddElement | script | data:text/html;charset=utf-8,D\n" 484 "blinkRequestResource | Script | data:text/html;charset=utf-8,D\n" 485 "blinkRequestResource | XMLHttpRequest | data:text/html;charset=utf-8,E"; 486 executeScriptInMainWorld(code); 487 ASSERT_TRUE(verifyActivities("")); 488 executeScriptInIsolatedWorld(code); 489 ASSERT_TRUE(verifyActivities(expectedActivities)); 490 } 491 492 } // namespace 493