• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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