Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/renderer/safe_browsing/threat_dom_details.h" | 5 #include "chrome/renderer/safe_browsing/threat_dom_details.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/strings/string_split.h" | |
| 9 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| 11 #include "base/test/scoped_feature_list.h" | |
| 10 #include "chrome/test/base/chrome_render_view_test.h" | 12 #include "chrome/test/base/chrome_render_view_test.h" |
| 11 #include "components/safe_browsing/common/safebrowsing_messages.h" | 13 #include "components/safe_browsing/common/safebrowsing_messages.h" |
| 14 #include "components/variations/variations_associated_data.h" | |
| 12 #include "content/public/renderer/render_view.h" | 15 #include "content/public/renderer/render_view.h" |
| 13 #include "net/base/escape.h" | 16 #include "net/base/escape.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" | |
| 14 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" | 18 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" |
| 15 #include "ui/native_theme/native_theme_switches.h" | 19 #include "ui/native_theme/native_theme_switches.h" |
| 16 | 20 |
| 21 namespace { | |
| 22 | |
| 23 std::unique_ptr<base::test::ScopedFeatureList> SetupTagAndAttributeFeature() { | |
| 24 std::map<std::string, std::string> feature_params; | |
| 25 feature_params[std::string(safe_browsing::kTagAndAttributeParamName)] = | |
| 26 "div,foo,div,baz"; | |
| 27 variations::AssociateVariationParams( | |
| 28 safe_browsing::kThreatDomDetailsTagAndAttributeFeature.name, "Group", | |
| 29 feature_params); | |
| 30 base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial( | |
| 31 safe_browsing::kThreatDomDetailsTagAndAttributeFeature.name, "Group"); | |
| 32 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); | |
| 33 feature_list->InitializeFromCommandLine( | |
| 34 safe_browsing::kThreatDomDetailsTagAndAttributeFeature.name, | |
| 35 std::string()); | |
| 36 feature_list->AssociateReportingFieldTrial( | |
| 37 safe_browsing::kThreatDomDetailsTagAndAttributeFeature.name, | |
| 38 base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial); | |
| 39 std::unique_ptr<base::test::ScopedFeatureList> scoped_list( | |
| 40 new base::test::ScopedFeatureList); | |
| 41 scoped_list->InitWithFeatureList(std::move(feature_list)); | |
| 42 return scoped_list; | |
| 43 } | |
|
Jialiu Lin
2017/02/25 00:46:18
empty line before "} // namespace"
lpz
2017/02/27 15:46:43
Done.
| |
| 44 } // namespace | |
| 45 | |
| 17 typedef ChromeRenderViewTest ThreatDOMDetailsTest; | 46 typedef ChromeRenderViewTest ThreatDOMDetailsTest; |
|
Jialiu Lin
2017/02/25 00:46:18
Since you're using "using" in other places, maybe
lpz
2017/02/27 15:46:43
Done.
| |
| 18 | 47 |
| 48 using testing::ElementsAre; | |
| 49 | |
| 19 TEST_F(ThreatDOMDetailsTest, Everything) { | 50 TEST_F(ThreatDOMDetailsTest, Everything) { |
| 20 blink::WebRuntimeFeatures::enableOverlayScrollbars( | 51 blink::WebRuntimeFeatures::enableOverlayScrollbars( |
| 21 ui::IsOverlayScrollbarEnabled()); | 52 ui::IsOverlayScrollbarEnabled()); |
| 22 std::unique_ptr<safe_browsing::ThreatDOMDetails> details( | 53 std::unique_ptr<safe_browsing::ThreatDOMDetails> details( |
| 23 safe_browsing::ThreatDOMDetails::Create(view_->GetMainRenderFrame())); | 54 safe_browsing::ThreatDOMDetails::Create(view_->GetMainRenderFrame())); |
| 24 // Lower kMaxNodes for the test. Loading 500 subframes in a | 55 // Lower kMaxNodes for the test. Loading 500 subframes in a |
| 25 // debug build takes a while. | 56 // debug build takes a while. |
| 26 details->kMaxNodes = 50; | 57 details->kMaxNodes = 50; |
| 27 | 58 |
| 28 const char urlprefix[] = "data:text/html;charset=utf-8,"; | 59 const char urlprefix[] = "data:text/html;charset=utf-8,"; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 71 EXPECT_TRUE(param.child_node_ids.empty()); | 102 EXPECT_TRUE(param.child_node_ids.empty()); |
| 72 | 103 |
| 73 param = params[2]; | 104 param = params[2]; |
| 74 EXPECT_EQ(url, param.url); | 105 EXPECT_EQ(url, param.url); |
| 75 EXPECT_EQ(0, param.node_id); | 106 EXPECT_EQ(0, param.node_id); |
| 76 EXPECT_EQ(0, param.parent_node_id); | 107 EXPECT_EQ(0, param.parent_node_id); |
| 77 EXPECT_TRUE(param.child_node_ids.empty()); | 108 EXPECT_TRUE(param.child_node_ids.empty()); |
| 78 } | 109 } |
| 79 | 110 |
| 80 { | 111 { |
| 81 // A page with an iframe which in turn contains an iframe. | 112 // A page with some divs containing an iframe which itself contains an |
| 113 // iframe. | |
| 82 // html | 114 // html |
| 83 // \ iframe1 | 115 // \ div foo |
| 84 // \ iframe2 | 116 // \ div bar |
| 117 // \ div baz, iframe1 | |
| 118 // \ iframe2 | |
| 85 // Since ThreatDOMDetails is a RenderFrameObserver, it will only | 119 // Since ThreatDOMDetails is a RenderFrameObserver, it will only |
| 86 // extract resources from the frame it assigned to (in this case, | 120 // extract resources from the frame it assigned to (in this case, |
| 87 // the main frame). Extracting resources from all frames within a | 121 // the main frame). Extracting resources from all frames within a |
| 88 // page is covered in SafeBrowsingBlockingPageBrowserTest. | 122 // page is covered in SafeBrowsingBlockingPageBrowserTest. |
| 89 // In this example, ExtractResources() will still touch iframe1 | 123 // In this example, ExtractResources() will still touch iframe1 |
| 90 // since it is the direct child of the main frame, but it would not | 124 // since it is the direct child of the main frame, but it would not |
| 91 // go inside of iframe1. | 125 // go inside of iframe1. |
| 126 // We configure the test to collect divs with attribute foo and baz, but not | |
| 127 // divs with attribute bar. So div foo will be collected and contain iframe1 | |
| 128 // and div baz as children. | |
| 92 std::string iframe2_html = "<html><body>iframe2</body></html>"; | 129 std::string iframe2_html = "<html><body>iframe2</body></html>"; |
| 93 GURL iframe2_url(urlprefix + iframe2_html); | 130 GURL iframe2_url(urlprefix + iframe2_html); |
| 94 std::string iframe1_html = "<iframe src=\"" + | 131 std::string iframe1_html = "<iframe src=\"" + |
| 95 net::EscapeForHTML(iframe2_url.spec()) + | 132 net::EscapeForHTML(iframe2_url.spec()) + |
| 96 "\"></iframe>"; | 133 "\"></iframe>"; |
| 97 GURL iframe1_url(urlprefix + iframe1_html); | 134 GURL iframe1_url(urlprefix + iframe1_html); |
| 98 std::string html = "<html><head><iframe src=\"" + | 135 std::string html = |
| 99 net::EscapeForHTML(iframe1_url.spec()) + | 136 "<html><head><div foo=1><div bar=1><div baz=1></div>" |
| 100 "\"></iframe></head></html>"; | 137 "<iframe src=\"" + |
| 138 net::EscapeForHTML(iframe1_url.spec()) + | |
| 139 "\"></iframe></div></div></head></html>"; | |
| 101 GURL url(urlprefix + html); | 140 GURL url(urlprefix + html); |
| 102 | 141 |
| 142 // Configure a field trial to collect divs with attribute foo. | |
| 143 std::unique_ptr<base::test::ScopedFeatureList> feature_list = | |
| 144 SetupTagAndAttributeFeature(); | |
| 145 | |
| 103 LoadHTML(html.c_str()); | 146 LoadHTML(html.c_str()); |
| 104 std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params; | 147 std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params; |
| 105 details->ExtractResources(¶ms); | 148 details->ExtractResources(¶ms); |
| 106 ASSERT_EQ(2u, params.size()); | 149 ASSERT_EQ(4u, params.size()); |
| 107 | 150 |
| 108 auto& param = params[0]; | 151 auto& param = params[0]; |
| 152 EXPECT_TRUE(param.url.is_empty()); | |
| 153 EXPECT_EQ(url, param.parent); | |
| 154 EXPECT_EQ("DIV", param.tag_name); | |
| 155 // The children field contains URLs, but this mapping is not currently | |
| 156 // maintained among the interior nodes. The summary node is the parent of | |
| 157 // all elements in the frame. | |
| 158 EXPECT_TRUE(param.children.empty()); | |
| 159 EXPECT_EQ(1, param.node_id); | |
| 160 EXPECT_EQ(0, param.parent_node_id); | |
| 161 EXPECT_THAT(param.child_node_ids, ElementsAre(2, 3)); | |
| 162 | |
| 163 param = params[1]; | |
| 164 EXPECT_TRUE(param.url.is_empty()); | |
| 165 EXPECT_EQ(url, param.parent); | |
| 166 EXPECT_EQ("DIV", param.tag_name); | |
| 167 EXPECT_TRUE(param.children.empty()); | |
| 168 EXPECT_EQ(2, param.node_id); | |
| 169 EXPECT_EQ(1, param.parent_node_id); | |
| 170 EXPECT_TRUE(param.child_node_ids.empty()); | |
| 171 | |
| 172 param = params[2]; | |
| 109 EXPECT_EQ(iframe1_url, param.url); | 173 EXPECT_EQ(iframe1_url, param.url); |
| 110 EXPECT_EQ(url, param.parent); | 174 EXPECT_EQ(url, param.parent); |
| 111 EXPECT_EQ("IFRAME", param.tag_name); | 175 EXPECT_EQ("IFRAME", param.tag_name); |
| 112 EXPECT_EQ(0u, param.children.size()); | 176 EXPECT_TRUE(param.children.empty()); |
| 113 EXPECT_EQ(1, param.node_id); | 177 EXPECT_EQ(3, param.node_id); |
| 114 EXPECT_EQ(0, param.parent_node_id); | 178 EXPECT_EQ(1, param.parent_node_id); |
| 115 EXPECT_TRUE(param.child_node_ids.empty()); | 179 EXPECT_TRUE(param.child_node_ids.empty()); |
| 116 | 180 |
| 117 param = params[1]; | 181 param = params[3]; |
| 118 EXPECT_EQ(url, param.url); | 182 EXPECT_EQ(url, param.url); |
| 119 EXPECT_EQ(GURL(), param.parent); | 183 EXPECT_EQ(GURL(), param.parent); |
| 120 EXPECT_EQ(1u, param.children.size()); | 184 EXPECT_THAT(param.children, ElementsAre(iframe1_url)); |
| 121 EXPECT_EQ(0, param.node_id); | 185 EXPECT_EQ(0, param.node_id); |
| 122 EXPECT_EQ(0, param.parent_node_id); | 186 EXPECT_EQ(0, param.parent_node_id); |
| 123 EXPECT_TRUE(param.child_node_ids.empty()); | 187 EXPECT_TRUE(param.child_node_ids.empty()); |
| 124 } | 188 } |
| 125 | 189 |
| 126 { | 190 { |
| 127 // Test >50 subframes. | 191 // Test >50 subframes. |
| 128 std::string html; | 192 std::string html; |
| 129 for (int i = 0; i < 55; ++i) { | 193 for (int i = 0; i < 55; ++i) { |
| 130 // The iframe contents is just a number. | 194 // The iframe contents is just a number. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 168 // The element nodes should all have node IDs. | 232 // The element nodes should all have node IDs. |
| 169 for (size_t i = 0; i < params.size() - 1; ++i) { | 233 for (size_t i = 0; i < params.size() - 1; ++i) { |
| 170 auto& param = params[i]; | 234 auto& param = params[i]; |
| 171 const int expected_id = i + 1; | 235 const int expected_id = i + 1; |
| 172 EXPECT_EQ(expected_id, param.node_id); | 236 EXPECT_EQ(expected_id, param.node_id); |
| 173 EXPECT_EQ(0, param.parent_node_id); | 237 EXPECT_EQ(0, param.parent_node_id); |
| 174 EXPECT_TRUE(param.child_node_ids.empty()); | 238 EXPECT_TRUE(param.child_node_ids.empty()); |
| 175 } | 239 } |
| 176 } | 240 } |
| 177 } | 241 } |
| OLD | NEW |