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
17namespace {
18
19using blink::FrameTestHelpers::WebViewHelper;
20using blink::FrameTestHelpers::pumpPendingRequestsDoNotUse;
21using namespace blink;
22
23class TestActivityLogger : public V8DOMActivityLogger {
24public:
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
57private:
58    Vector<String> m_loggedActivities;
59};
60
61class ActivityLoggerTest : public testing::Test {
62protected:
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
95private:
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
106TEST_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
125TEST_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
150TEST_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
176TEST_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
199TEST_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
226TEST_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
250TEST_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
275TEST_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
299TEST_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
323TEST_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
346TEST_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
374TEST_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
397TEST_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
420TEST_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
443TEST_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
469TEST_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