| Index: third_party/WebKit/Source/bindings/core/v8/BindingSecurityTest.cpp | 
| diff --git a/third_party/WebKit/Source/bindings/core/v8/BindingSecurityTest.cpp b/third_party/WebKit/Source/bindings/core/v8/BindingSecurityTest.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..5cf7b25d878b5bd850de17133da61fd4670a5a0d | 
| --- /dev/null | 
| +++ b/third_party/WebKit/Source/bindings/core/v8/BindingSecurityTest.cpp | 
| @@ -0,0 +1,147 @@ | 
| +// Copyright 2017 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "bindings/core/v8/BindingSecurity.h" | 
| + | 
| +#include "core/dom/Document.h" | 
| +#include "core/frame/UseCounter.h" | 
| +#include "core/page/Page.h" | 
| +#include "platform/testing/UnitTestHelpers.h" | 
| +#include "testing/gtest/include/gtest/gtest.h" | 
| +#include "web/tests/sim/SimRequest.h" | 
| +#include "web/tests/sim/SimTest.h" | 
| + | 
| +namespace blink { | 
| + | 
| +namespace { | 
| +const char kMainFrame[] = "https://example.com/main.html"; | 
| +const char kSameOriginTarget[] = "https://example.com/target.html"; | 
| +const char kCrossOriginTarget[] = "https://not-example.com/target.html"; | 
| +} | 
| + | 
| +class BindingSecurityCounterTest | 
| +    : public SimTest, | 
| +      public ::testing::WithParamInterface<const char*> { | 
| + public: | 
| +  enum class OriginDisposition { CrossOrigin, SameOrigin }; | 
| + | 
| +  BindingSecurityCounterTest() {} | 
| + | 
| +  void LoadWindowAndAccessProperty(OriginDisposition which_origin, | 
| +                                   const String& property) { | 
| +    GetDocument() | 
| +        .GetFrame() | 
| +        ->GetSettings() | 
| +        ->SetJavaScriptCanOpenWindowsAutomatically(true); | 
| +    SimRequest main(kMainFrame, "text/html"); | 
| +    SimRequest target(which_origin == OriginDisposition::CrossOrigin | 
| +                          ? kCrossOriginTarget | 
| +                          : kSameOriginTarget, | 
| +                      "text/html"); | 
| +    const String& document = String::Format( | 
| +        "<!DOCTYPE html>" | 
| +        "<script>" | 
| +        "  window.addEventListener('message', e => {" | 
| +        "    window.other = e.source.%s;" | 
| +        "    console.log('yay');" | 
| +        "  });" | 
| +        "  var w = window.open('%s');" | 
| +        "</script>", | 
| +        property.Utf8().data(), | 
| +        which_origin == OriginDisposition::CrossOrigin ? kCrossOriginTarget | 
| +                                                       : kSameOriginTarget); | 
| + | 
| +    LoadURL(kMainFrame); | 
| +    main.Complete(document); | 
| +    target.Complete( | 
| +        "<!DOCTYPE html>" | 
| +        "<script>window.opener.postMessage('yay', '*');</script>"); | 
| +    testing::RunPendingTasks(); | 
| +  } | 
| + | 
| +  void LoadFrameAndAccessProperty(OriginDisposition which_origin, | 
| +                                  const String& property) { | 
| +    GetDocument() | 
| +        .GetFrame() | 
| +        ->GetSettings() | 
| +        ->SetJavaScriptCanOpenWindowsAutomatically(true); | 
| +    SimRequest main(kMainFrame, "text/html"); | 
| +    SimRequest target(which_origin == OriginDisposition::CrossOrigin | 
| +                          ? kCrossOriginTarget | 
| +                          : kSameOriginTarget, | 
| +                      "text/html"); | 
| +    const String& document = String::Format( | 
| +        "<!DOCTYPE html>" | 
| +        "<body>" | 
| +        "<script>" | 
| +        "  var i = document.createElement('iframe');" | 
| +        "  window.addEventListener('message', e => {" | 
| +        "    window.other = e.source.%s;" | 
| +        "    console.log('yay');" | 
| +        "  });" | 
| +        "  i.src = '%s';" | 
| +        "  document.body.appendChild(i);" | 
| +        "</script>", | 
| +        property.Utf8().data(), | 
| +        which_origin == OriginDisposition::CrossOrigin ? kCrossOriginTarget | 
| +                                                       : kSameOriginTarget); | 
| + | 
| +    LoadURL(kMainFrame); | 
| +    main.Complete(document); | 
| +    target.Complete( | 
| +        "<!DOCTYPE html>" | 
| +        "<script>window.top.postMessage('yay', '*');</script>"); | 
| +    testing::RunPendingTasks(); | 
| +  } | 
| +}; | 
| + | 
| +INSTANTIATE_TEST_CASE_P(WindowProperties, | 
| +                        BindingSecurityCounterTest, | 
| +                        ::testing::Values("window", | 
| +                                          "self", | 
| +                                          "location", | 
| +                                          "close", | 
| +                                          "closed", | 
| +                                          "focus", | 
| +                                          "blur", | 
| +                                          "frames", | 
| +                                          "length", | 
| +                                          "top", | 
| +                                          "opener", | 
| +                                          "parent", | 
| +                                          "postMessage")); | 
| + | 
| +TEST_P(BindingSecurityCounterTest, CrossOriginWindow) { | 
| +  LoadWindowAndAccessProperty(OriginDisposition::CrossOrigin, GetParam()); | 
| +  EXPECT_TRUE(GetDocument().GetPage()->GetUseCounter().HasRecordedMeasurement( | 
| +      UseCounter::kCrossOriginPropertyAccess)); | 
| +  EXPECT_TRUE(GetDocument().GetPage()->GetUseCounter().HasRecordedMeasurement( | 
| +      UseCounter::kCrossOriginPropertyAccessFromOpener)); | 
| +} | 
| + | 
| +TEST_P(BindingSecurityCounterTest, SameOriginWindow) { | 
| +  LoadWindowAndAccessProperty(OriginDisposition::SameOrigin, GetParam()); | 
| +  EXPECT_FALSE(GetDocument().GetPage()->GetUseCounter().HasRecordedMeasurement( | 
| +      UseCounter::kCrossOriginPropertyAccess)); | 
| +  EXPECT_FALSE(GetDocument().GetPage()->GetUseCounter().HasRecordedMeasurement( | 
| +      UseCounter::kCrossOriginPropertyAccessFromOpener)); | 
| +} | 
| + | 
| +TEST_P(BindingSecurityCounterTest, CrossOriginFrame) { | 
| +  LoadFrameAndAccessProperty(OriginDisposition::CrossOrigin, GetParam()); | 
| +  EXPECT_TRUE(GetDocument().GetPage()->GetUseCounter().HasRecordedMeasurement( | 
| +      UseCounter::kCrossOriginPropertyAccess)); | 
| +  EXPECT_FALSE(GetDocument().GetPage()->GetUseCounter().HasRecordedMeasurement( | 
| +      UseCounter::kCrossOriginPropertyAccessFromOpener)); | 
| +} | 
| + | 
| +TEST_P(BindingSecurityCounterTest, SameOriginFrame) { | 
| +  LoadFrameAndAccessProperty(OriginDisposition::SameOrigin, GetParam()); | 
| +  EXPECT_FALSE(GetDocument().GetPage()->GetUseCounter().HasRecordedMeasurement( | 
| +      UseCounter::kCrossOriginPropertyAccess)); | 
| +  EXPECT_FALSE(GetDocument().GetPage()->GetUseCounter().HasRecordedMeasurement( | 
| +      UseCounter::kCrossOriginPropertyAccessFromOpener)); | 
| +} | 
| + | 
| +}  // namespace | 
|  |