Home | History | Annotate | Download | only in tests
      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