Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1037)

Side by Side Diff: chrome/renderer/content_settings_observer_browsertest.cc

Issue 1904183002: Revert of DocumentLoader should commit the load before creating a DocumentWriter (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/loader/DocumentLoader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include "chrome/common/render_messages.h" 7 #include "chrome/common/render_messages.h"
8 #include "chrome/renderer/content_settings_observer.h" 8 #include "chrome/renderer/content_settings_observer.h"
9 #include "chrome/test/base/chrome_render_view_test.h" 9 #include "chrome/test/base/chrome_render_view_test.h"
10 #include "components/content_settings/content/common/content_settings_messages.h " 10 #include "components/content_settings/content/common/content_settings_messages.h "
11 #include "components/content_settings/core/common/content_settings.h" 11 #include "components/content_settings/core/common/content_settings.h"
12 #include "content/public/renderer/render_view.h" 12 #include "content/public/renderer/render_view.h"
13 #include "ipc/ipc_message_macros.h" 13 #include "ipc/ipc_message_macros.h"
14 #include "testing/gmock/include/gmock/gmock.h" 14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "third_party/WebKit/public/web/WebFrameContentDumper.h"
17 #include "third_party/WebKit/public/web/WebView.h" 16 #include "third_party/WebKit/public/web/WebView.h"
18 17
19 using testing::_; 18 using testing::_;
20 using testing::DeleteArg; 19 using testing::DeleteArg;
21 20
22 namespace { 21 namespace {
23 22
24 class MockContentSettingsObserver : public ContentSettingsObserver { 23 class MockContentSettingsObserver : public ContentSettingsObserver {
25 public: 24 public:
26 explicit MockContentSettingsObserver(content::RenderFrame* render_frame); 25 explicit MockContentSettingsObserver(content::RenderFrame* render_frame);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 81
83 // Accessing localStorage from the same origin again shouldn't result in a 82 // Accessing localStorage from the same origin again shouldn't result in a
84 // new IPC. 83 // new IPC.
85 observer.allowStorage(true); 84 observer.allowStorage(true);
86 ::testing::Mock::VerifyAndClearExpectations(&observer); 85 ::testing::Mock::VerifyAndClearExpectations(&observer);
87 } 86 }
88 87
89 // Regression test for http://crbug.com/35011 88 // Regression test for http://crbug.com/35011
90 TEST_F(ChromeRenderViewTest, JSBlockSentAfterPageLoad) { 89 TEST_F(ChromeRenderViewTest, JSBlockSentAfterPageLoad) {
91 // 1. Load page with JS. 90 // 1. Load page with JS.
92 const char kHtml[] = 91 std::string html = "<html>"
93 "<html>" 92 "<head>"
94 "<head>" 93 "<script>document.createElement('div');</script>"
95 "<script>document.createElement('div');</script>" 94 "</head>"
96 "</head>" 95 "<body>"
97 "<body>" 96 "</body>"
98 "</body>" 97 "</html>";
99 "</html>";
100 render_thread_->sink().ClearMessages(); 98 render_thread_->sink().ClearMessages();
101 LoadHTML(kHtml); 99 LoadHTML(html.c_str());
102 100
103 // 2. Block JavaScript. 101 // 2. Block JavaScript.
104 RendererContentSettingRules content_setting_rules; 102 RendererContentSettingRules content_setting_rules;
105 ContentSettingsForOneType& script_setting_rules = 103 ContentSettingsForOneType& script_setting_rules =
106 content_setting_rules.script_rules; 104 content_setting_rules.script_rules;
107 script_setting_rules.push_back( 105 script_setting_rules.push_back(
108 ContentSettingPatternSource(ContentSettingsPattern::Wildcard(), 106 ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
109 ContentSettingsPattern::Wildcard(), 107 ContentSettingsPattern::Wildcard(),
110 CONTENT_SETTING_BLOCK, 108 CONTENT_SETTING_BLOCK,
111 std::string(), 109 std::string(),
112 false)); 110 false));
113 ContentSettingsObserver* observer = ContentSettingsObserver::Get( 111 ContentSettingsObserver* observer = ContentSettingsObserver::Get(
114 view_->GetMainRenderFrame()); 112 view_->GetMainRenderFrame());
115 observer->SetContentSettingRules(&content_setting_rules); 113 observer->SetContentSettingRules(&content_setting_rules);
116 114
117 // Make sure no pending messages are in the queue. 115 // Make sure no pending messages are in the queue.
118 ProcessPendingMessages(); 116 ProcessPendingMessages();
119 render_thread_->sink().ClearMessages(); 117 render_thread_->sink().ClearMessages();
120 118
121 // 3. Reload page. 119 // 3. Reload page.
122 std::string url_str = "data:text/html;charset=utf-8,"; 120 std::string url_str = "data:text/html;charset=utf-8,";
123 url_str.append(kHtml); 121 url_str.append(html);
124 GURL url(url_str); 122 GURL url(url_str);
125 Reload(url); 123 Reload(url);
126 ProcessPendingMessages(); 124 ProcessPendingMessages();
127 125
128 // 4. Verify that the notification that javascript was blocked is sent after 126 // 4. Verify that the notification that javascript was blocked is sent after
129 // the navigation notification is sent. 127 // the navigation notification is sent.
130 int navigation_index = -1; 128 int navigation_index = -1;
131 int block_index = -1; 129 int block_index = -1;
132 for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) { 130 for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) {
133 const IPC::Message* msg = render_thread_->sink().GetMessageAt(i); 131 const IPC::Message* msg = render_thread_->sink().GetMessageAt(i);
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 ContentSettingsPattern::Wildcard(), 262 ContentSettingsPattern::Wildcard(),
265 CONTENT_SETTING_BLOCK, 263 CONTENT_SETTING_BLOCK,
266 std::string(), 264 std::string(),
267 false)); 265 false));
268 266
269 ContentSettingsObserver* observer = 267 ContentSettingsObserver* observer =
270 ContentSettingsObserver::Get(view_->GetMainRenderFrame()); 268 ContentSettingsObserver::Get(view_->GetMainRenderFrame());
271 observer->SetContentSettingRules(&content_setting_rules); 269 observer->SetContentSettingRules(&content_setting_rules);
272 270
273 // Load a page which contains a script. 271 // Load a page which contains a script.
274 const char kHtml[] = 272 std::string html = "<html>"
275 "<html>" 273 "<head>"
276 "<head>" 274 "<script src='data:foo'></script>"
277 "<script src='data:foo'></script>" 275 "</head>"
278 "</head>" 276 "<body>"
279 "<body>" 277 "</body>"
280 "</body>" 278 "</html>";
281 "</html>"; 279 LoadHTML(html.c_str());
282 LoadHTML(kHtml);
283 280
284 // Verify that the script was blocked. 281 // Verify that the script was blocked.
285 bool was_blocked = false; 282 bool was_blocked = false;
286 for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) { 283 for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) {
287 const IPC::Message* msg = render_thread_->sink().GetMessageAt(i); 284 const IPC::Message* msg = render_thread_->sink().GetMessageAt(i);
288 if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID) 285 if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID)
289 was_blocked = true; 286 was_blocked = true;
290 } 287 }
291 EXPECT_TRUE(was_blocked); 288 EXPECT_TRUE(was_blocked);
292 } 289 }
293 290
294 TEST_F(ChromeRenderViewTest, ContentSettingsAllowScripts) { 291 TEST_F(ChromeRenderViewTest, ContentSettingsAllowScripts) {
295 // Set the content settings for scripts. 292 // Set the content settings for scripts.
296 RendererContentSettingRules content_setting_rules; 293 RendererContentSettingRules content_setting_rules;
297 ContentSettingsForOneType& script_setting_rules = 294 ContentSettingsForOneType& script_setting_rules =
298 content_setting_rules.script_rules; 295 content_setting_rules.script_rules;
299 script_setting_rules.push_back( 296 script_setting_rules.push_back(
300 ContentSettingPatternSource(ContentSettingsPattern::Wildcard(), 297 ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
301 ContentSettingsPattern::Wildcard(), 298 ContentSettingsPattern::Wildcard(),
302 CONTENT_SETTING_ALLOW, 299 CONTENT_SETTING_ALLOW,
303 std::string(), 300 std::string(),
304 false)); 301 false));
305 302
306 ContentSettingsObserver* observer = 303 ContentSettingsObserver* observer =
307 ContentSettingsObserver::Get(view_->GetMainRenderFrame()); 304 ContentSettingsObserver::Get(view_->GetMainRenderFrame());
308 observer->SetContentSettingRules(&content_setting_rules); 305 observer->SetContentSettingRules(&content_setting_rules);
309 306
310 // Load a page which contains a script. 307 // Load a page which contains a script.
311 const char kHtml[] = 308 std::string html = "<html>"
312 "<html>" 309 "<head>"
313 "<head>" 310 "<script src='data:foo'></script>"
314 "<script src='data:foo'></script>" 311 "</head>"
315 "</head>" 312 "<body>"
316 "<body>" 313 "</body>"
317 "</body>" 314 "</html>";
318 "</html>"; 315 LoadHTML(html.c_str());
319 LoadHTML(kHtml);
320 316
321 // Verify that the script was not blocked. 317 // Verify that the script was not blocked.
322 bool was_blocked = false; 318 bool was_blocked = false;
323 for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) { 319 for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) {
324 const IPC::Message* msg = render_thread_->sink().GetMessageAt(i); 320 const IPC::Message* msg = render_thread_->sink().GetMessageAt(i);
325 if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID) 321 if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID)
326 was_blocked = true; 322 was_blocked = true;
327 } 323 }
328 EXPECT_FALSE(was_blocked); 324 EXPECT_FALSE(was_blocked);
329 } 325 }
330 326
331 // Regression test for crbug.com/232410: Load a page with JS blocked. Then,
332 // allow JS and reload the page. In each case, only one of noscript or script
333 // tags should be enabled, but never both.
334 TEST_F(ChromeRenderViewTest, ContentSettingsNoscriptTag) {
335 // 1. Block JavaScript.
336 RendererContentSettingRules content_setting_rules;
337 ContentSettingsForOneType& script_setting_rules =
338 content_setting_rules.script_rules;
339 script_setting_rules.push_back(ContentSettingPatternSource(
340 ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(),
341 CONTENT_SETTING_BLOCK, std::string(), false));
342
343 ContentSettingsObserver* observer =
344 ContentSettingsObserver::Get(view_->GetMainRenderFrame());
345 observer->SetContentSettingRules(&content_setting_rules);
346
347 // 2. Load a page which contains a noscript tag and a script tag. Note that
348 // the page doesn't have a body tag.
349 const char kHtml[] =
350 "<html>"
351 "<noscript>JS_DISABLED</noscript>"
352 "<script>document.write('JS_ENABLED');</script>"
353 "</html>";
354 LoadHTML(kHtml);
355 EXPECT_NE(
356 std::string::npos,
357 blink::WebFrameContentDumper::dumpLayoutTreeAsText(
358 GetMainFrame(), blink::WebFrameContentDumper::LayoutAsTextNormal)
359 .utf8()
360 .find("JS_DISABLED"));
361 EXPECT_EQ(
362 std::string::npos,
363 blink::WebFrameContentDumper::dumpLayoutTreeAsText(
364 GetMainFrame(), blink::WebFrameContentDumper::LayoutAsTextNormal)
365 .utf8()
366 .find("JS_ENABLED"));
367
368 // 3. Allow JavaScript.
369 script_setting_rules.clear();
370 script_setting_rules.push_back(ContentSettingPatternSource(
371 ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(),
372 CONTENT_SETTING_ALLOW, std::string(), false));
373 observer->SetContentSettingRules(&content_setting_rules);
374
375 // 4. Reload the page.
376 std::string url_str = "data:text/html;charset=utf-8,";
377 url_str.append(kHtml);
378 GURL url(url_str);
379 Reload(url);
380 EXPECT_NE(
381 std::string::npos,
382 blink::WebFrameContentDumper::dumpLayoutTreeAsText(
383 GetMainFrame(), blink::WebFrameContentDumper::LayoutAsTextNormal)
384 .utf8()
385 .find("JS_ENABLED"));
386 EXPECT_EQ(
387 std::string::npos,
388 blink::WebFrameContentDumper::dumpLayoutTreeAsText(
389 GetMainFrame(), blink::WebFrameContentDumper::LayoutAsTextNormal)
390 .utf8()
391 .find("JS_DISABLED"));
392 }
393
394 // Checks that same page navigations don't update content settings for the page.
395 TEST_F(ChromeRenderViewTest, ContentSettingsSamePageNavigation) {
396 MockContentSettingsObserver mock_observer(view_->GetMainRenderFrame());
397 // Load a page which contains a script.
398 const char kHtml[] =
399 "<html>"
400 "<head>"
401 "<script src='data:foo'></script>"
402 "</head>"
403 "<body>"
404 "</body>"
405 "</html>";
406 LoadHTML(kHtml);
407
408 // Verify that the script was not blocked.
409 bool was_blocked = false;
410 for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) {
411 const IPC::Message* msg = render_thread_->sink().GetMessageAt(i);
412 if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID)
413 was_blocked = true;
414 }
415 EXPECT_FALSE(was_blocked);
416
417 // Block JavaScript.
418 RendererContentSettingRules content_setting_rules;
419 ContentSettingsForOneType& script_setting_rules =
420 content_setting_rules.script_rules;
421 script_setting_rules.push_back(ContentSettingPatternSource(
422 ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(),
423 CONTENT_SETTING_BLOCK, std::string(), false));
424
425 ContentSettingsObserver* observer =
426 ContentSettingsObserver::Get(view_->GetMainRenderFrame());
427 observer->SetContentSettingRules(&content_setting_rules);
428
429 // The page shouldn't see the change to script blocking setting after a
430 // same page navigation.
431 DidNavigateWithinPage(GetMainFrame(), true);
432 EXPECT_TRUE(observer->allowScript(true));
433 }
434
435 TEST_F(ChromeRenderViewTest, ContentSettingsInterstitialPages) { 327 TEST_F(ChromeRenderViewTest, ContentSettingsInterstitialPages) {
436 MockContentSettingsObserver mock_observer(view_->GetMainRenderFrame()); 328 MockContentSettingsObserver mock_observer(view_->GetMainRenderFrame());
437 // Block scripts. 329 // Block scripts.
438 RendererContentSettingRules content_setting_rules; 330 RendererContentSettingRules content_setting_rules;
439 ContentSettingsForOneType& script_setting_rules = 331 ContentSettingsForOneType& script_setting_rules =
440 content_setting_rules.script_rules; 332 content_setting_rules.script_rules;
441 script_setting_rules.push_back( 333 script_setting_rules.push_back(
442 ContentSettingPatternSource(ContentSettingsPattern::Wildcard(), 334 ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
443 ContentSettingsPattern::Wildcard(), 335 ContentSettingsPattern::Wildcard(),
444 CONTENT_SETTING_BLOCK, 336 CONTENT_SETTING_BLOCK,
445 std::string(), 337 std::string(),
446 false)); 338 false));
447 // Block images. 339 // Block images.
448 ContentSettingsForOneType& image_setting_rules = 340 ContentSettingsForOneType& image_setting_rules =
449 content_setting_rules.image_rules; 341 content_setting_rules.image_rules;
450 image_setting_rules.push_back( 342 image_setting_rules.push_back(
451 ContentSettingPatternSource(ContentSettingsPattern::Wildcard(), 343 ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
452 ContentSettingsPattern::Wildcard(), 344 ContentSettingsPattern::Wildcard(),
453 CONTENT_SETTING_BLOCK, 345 CONTENT_SETTING_BLOCK,
454 std::string(), 346 std::string(),
455 false)); 347 false));
456 348
457 ContentSettingsObserver* observer = 349 ContentSettingsObserver* observer =
458 ContentSettingsObserver::Get(view_->GetMainRenderFrame()); 350 ContentSettingsObserver::Get(view_->GetMainRenderFrame());
459 observer->SetContentSettingRules(&content_setting_rules); 351 observer->SetContentSettingRules(&content_setting_rules);
460 observer->OnSetAsInterstitial(); 352 observer->OnSetAsInterstitial();
461 353
462 // Load a page which contains a script. 354 // Load a page which contains a script.
463 const char kHtml[] = 355 std::string html = "<html>"
464 "<html>" 356 "<head>"
465 "<head>" 357 "<script src='data:foo'></script>"
466 "<script src='data:foo'></script>" 358 "</head>"
467 "</head>" 359 "<body>"
468 "<body>" 360 "</body>"
469 "</body>" 361 "</html>";
470 "</html>"; 362 LoadHTML(html.c_str());
471 LoadHTML(kHtml);
472 363
473 // Verify that the script was allowed. 364 // Verify that the script was allowed.
474 bool was_blocked = false; 365 bool was_blocked = false;
475 for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) { 366 for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) {
476 const IPC::Message* msg = render_thread_->sink().GetMessageAt(i); 367 const IPC::Message* msg = render_thread_->sink().GetMessageAt(i);
477 if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID) 368 if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID)
478 was_blocked = true; 369 was_blocked = true;
479 } 370 }
480 EXPECT_FALSE(was_blocked); 371 EXPECT_FALSE(was_blocked);
481 372
482 // Verify that images are allowed. 373 // Verify that images are allowed.
483 EXPECT_CALL(mock_observer, OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES, 374 EXPECT_CALL(mock_observer, OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES,
484 base::string16())).Times(0); 375 base::string16())).Times(0);
485 EXPECT_TRUE(observer->allowImage(true, mock_observer.image_url_)); 376 EXPECT_TRUE(observer->allowImage(true, mock_observer.image_url_));
486 ::testing::Mock::VerifyAndClearExpectations(&observer); 377 ::testing::Mock::VerifyAndClearExpectations(&observer);
487 } 378 }
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/loader/DocumentLoader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698