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:
~TestActivityLogger()25 virtual ~TestActivityLogger() { }
26
logGetter(const String & apiName)27 void logGetter(const String& apiName) OVERRIDE
28 {
29 m_loggedActivities.append(apiName);
30 }
31
logSetter(const String & apiName,const v8::Handle<v8::Value> & newValue)32 void logSetter(const String& apiName, const v8::Handle<v8::Value>& newValue) OVERRIDE
33 {
34 m_loggedActivities.append(apiName + " | " + toCoreStringWithUndefinedOrNullCheck(newValue));
35 }
36
logMethod(const String & apiName,int argc,const v8::Handle<v8::Value> * argv)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
logEvent(const String & eventName,int argc,const String * argv)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
clear()54 void clear() { m_loggedActivities.clear(); }
verifyActivities(const Vector<String> & activities) const55 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:
ActivityLoggerTest()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
executeScriptInMainWorld(const String & script) const71 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
executeScriptInIsolatedWorld(const String & script) const78 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
verifyActivities(const String & activities)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
TEST_F(ActivityLoggerTest,EventHandler)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
TEST_F(ActivityLoggerTest,ScriptElement)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
TEST_F(ActivityLoggerTest,IFrameElement)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
TEST_F(ActivityLoggerTest,AnchorElement)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
TEST_F(ActivityLoggerTest,LinkElement)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
TEST_F(ActivityLoggerTest,InputElement)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
TEST_F(ActivityLoggerTest,ButtonElement)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
TEST_F(ActivityLoggerTest,FormElement)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
TEST_F(ActivityLoggerTest,IFrameSrcAttribute)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
TEST_F(ActivityLoggerTest,AnchorHrefAttribute)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
TEST_F(ActivityLoggerTest,LinkHrefAttribute)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
TEST_F(ActivityLoggerTest,InputFormActionAttribute)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
TEST_F(ActivityLoggerTest,ButtonFormActionAttribute)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
TEST_F(ActivityLoggerTest,FormActionAttribute)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
TEST_F(ActivityLoggerTest,LocalDOMWindowAttribute)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
TEST_F(ActivityLoggerTest,RequestResource)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