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

Side by Side Diff: chrome/browser/policy/policy_browsertest.cc

Issue 23427003: Reload force-installed extensions on crash/force-close (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 3 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
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 <algorithm> 5 #include <algorithm>
6 #include <string> 6 #include <string>
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/file_util.h" 13 #include "base/file_util.h"
14 #include "base/files/file_enumerator.h" 14 #include "base/files/file_enumerator.h"
15 #include "base/files/file_path.h" 15 #include "base/files/file_path.h"
16 #include "base/files/scoped_temp_dir.h" 16 #include "base/files/scoped_temp_dir.h"
17 #include "base/memory/ref_counted.h" 17 #include "base/memory/ref_counted.h"
18 #include "base/path_service.h" 18 #include "base/path_service.h"
19 #include "base/prefs/pref_service.h" 19 #include "base/prefs/pref_service.h"
20 #include "base/run_loop.h" 20 #include "base/run_loop.h"
21 #include "base/strings/string16.h" 21 #include "base/strings/string16.h"
22 #include "base/strings/string_util.h" 22 #include "base/strings/string_util.h"
23 #include "base/strings/stringprintf.h" 23 #include "base/strings/stringprintf.h"
24 #include "base/strings/utf_string_conversions.h" 24 #include "base/strings/utf_string_conversions.h"
25 #include "base/test/test_file_util.h" 25 #include "base/test/test_file_util.h"
26 #include "base/time/time.h" 26 #include "base/time/time.h"
27 #include "base/values.h" 27 #include "base/values.h"
28 #include "chrome/app/chrome_command_ids.h" 28 #include "chrome/app/chrome_command_ids.h"
29 #include "chrome/browser/autocomplete/autocomplete_controller.h" 29 #include "chrome/browser/autocomplete/autocomplete_controller.h"
30 #include "chrome/browser/background/background_contents_service.h"
30 #include "chrome/browser/browser_process.h" 31 #include "chrome/browser/browser_process.h"
31 #include "chrome/browser/chrome_notification_types.h" 32 #include "chrome/browser/chrome_notification_types.h"
32 #include "chrome/browser/content_settings/tab_specific_content_settings.h" 33 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
33 #include "chrome/browser/devtools/devtools_window.h" 34 #include "chrome/browser/devtools/devtools_window.h"
34 #include "chrome/browser/download/download_prefs.h" 35 #include "chrome/browser/download/download_prefs.h"
35 #include "chrome/browser/extensions/crx_installer.h" 36 #include "chrome/browser/extensions/crx_installer.h"
37 #include "chrome/browser/extensions/extension_host.h"
38 #include "chrome/browser/extensions/extension_process_manager.h"
36 #include "chrome/browser/extensions/extension_service.h" 39 #include "chrome/browser/extensions/extension_service.h"
37 #include "chrome/browser/extensions/extension_system.h" 40 #include "chrome/browser/extensions/extension_system.h"
38 #include "chrome/browser/extensions/unpacked_installer.h" 41 #include "chrome/browser/extensions/unpacked_installer.h"
39 #include "chrome/browser/extensions/updater/extension_updater.h" 42 #include "chrome/browser/extensions/updater/extension_updater.h"
40 #include "chrome/browser/infobars/infobar_service.h" 43 #include "chrome/browser/infobars/infobar_service.h"
41 #include "chrome/browser/media/media_capture_devices_dispatcher.h" 44 #include "chrome/browser/media/media_capture_devices_dispatcher.h"
42 #include "chrome/browser/media/media_stream_devices_controller.h" 45 #include "chrome/browser/media/media_stream_devices_controller.h"
43 #include "chrome/browser/metrics/variations/variations_service.h" 46 #include "chrome/browser/metrics/variations/variations_service.h"
44 #include "chrome/browser/net/url_request_mock_util.h" 47 #include "chrome/browser/net/url_request_mock_util.h"
45 #include "chrome/browser/plugins/plugin_prefs.h" 48 #include "chrome/browser/plugins/plugin_prefs.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 #include "chrome/common/url_constants.h" 82 #include "chrome/common/url_constants.h"
80 #include "chrome/test/base/in_process_browser_test.h" 83 #include "chrome/test/base/in_process_browser_test.h"
81 #include "chrome/test/base/test_switches.h" 84 #include "chrome/test/base/test_switches.h"
82 #include "chrome/test/base/ui_test_utils.h" 85 #include "chrome/test/base/ui_test_utils.h"
83 #include "content/public/browser/browser_child_process_host_iterator.h" 86 #include "content/public/browser/browser_child_process_host_iterator.h"
84 #include "content/public/browser/browser_context.h" 87 #include "content/public/browser/browser_context.h"
85 #include "content/public/browser/browser_thread.h" 88 #include "content/public/browser/browser_thread.h"
86 #include "content/public/browser/child_process_data.h" 89 #include "content/public/browser/child_process_data.h"
87 #include "content/public/browser/download_item.h" 90 #include "content/public/browser/download_item.h"
88 #include "content/public/browser/download_manager.h" 91 #include "content/public/browser/download_manager.h"
92 #include "content/public/browser/notification_details.h"
93 #include "content/public/browser/notification_observer.h"
89 #include "content/public/browser/notification_registrar.h" 94 #include "content/public/browser/notification_registrar.h"
90 #include "content/public/browser/notification_service.h" 95 #include "content/public/browser/notification_service.h"
91 #include "content/public/browser/notification_source.h" 96 #include "content/public/browser/notification_source.h"
92 #include "content/public/browser/notification_types.h" 97 #include "content/public/browser/notification_types.h"
93 #include "content/public/browser/plugin_service.h" 98 #include "content/public/browser/plugin_service.h"
94 #include "content/public/browser/render_process_host.h" 99 #include "content/public/browser/render_process_host.h"
95 #include "content/public/browser/render_view_host.h" 100 #include "content/public/browser/render_view_host.h"
96 #include "content/public/browser/web_contents.h" 101 #include "content/public/browser/web_contents.h"
97 #include "content/public/common/content_constants.h" 102 #include "content/public/common/content_constants.h"
98 #include "content/public/common/content_paths.h" 103 #include "content/public/common/content_paths.h"
99 #include "content/public/common/page_transition_types.h" 104 #include "content/public/common/page_transition_types.h"
100 #include "content/public/common/process_type.h" 105 #include "content/public/common/process_type.h"
106 #include "content/public/common/result_codes.h"
101 #include "content/public/common/url_constants.h" 107 #include "content/public/common/url_constants.h"
102 #include "content/public/common/webplugininfo.h" 108 #include "content/public/common/webplugininfo.h"
103 #include "content/public/test/browser_test_utils.h" 109 #include "content/public/test/browser_test_utils.h"
104 #include "content/public/test/download_test_observer.h" 110 #include "content/public/test/download_test_observer.h"
105 #include "content/public/test/mock_notification_observer.h" 111 #include "content/public/test/mock_notification_observer.h"
106 #include "content/public/test/test_navigation_observer.h" 112 #include "content/public/test/test_navigation_observer.h"
107 #include "content/public/test/test_utils.h" 113 #include "content/public/test/test_utils.h"
108 #include "content/test/net/url_request_failed_job.h" 114 #include "content/test/net/url_request_failed_job.h"
109 #include "content/test/net/url_request_mock_http_job.h" 115 #include "content/test/net/url_request_mock_http_job.h"
110 #include "grit/generated_resources.h" 116 #include "grit/generated_resources.h"
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 ++output_mute_changed_count_; 448 ++output_mute_changed_count_;
443 } 449 }
444 450
445 private: 451 private:
446 int output_mute_changed_count_; 452 int output_mute_changed_count_;
447 453
448 DISALLOW_COPY_AND_ASSIGN(TestAudioObserver); 454 DISALLOW_COPY_AND_ASSIGN(TestAudioObserver);
449 }; 455 };
450 #endif 456 #endif
451 457
458 // This class is a customised version of WindowedNotificationObserver to allow
bartfab (slow) 2013/08/26 13:26:53 Nit: s/WindowedNotificationObserver/content::Windo
anitawoodruff 2013/08/26 21:45:23 Done.
459 // us to register and wait until one of two simple events has occurred. See
bartfab (slow) 2013/08/26 13:26:53 Nit: "simple events" is nomenclature I introduced
anitawoodruff 2013/08/26 21:45:23 Done.
460 // WindowedNotificationObserver for further documentation.
461 class OneOfTwoNotificationsObserver : public content::NotificationObserver {
462 public:
463 // Set up to wait for one of two conditions. The condition is met when a
bartfab (slow) 2013/08/26 13:26:53 Nit: As above, "condition" is not the right term h
anitawoodruff 2013/08/26 21:45:23 Done.
464 // notification of either |notification_type1| or |notification_type1| is
465 // received.
466 OneOfTwoNotificationsObserver(int notification_type1, int notification_type2);
467
bartfab (slow) 2013/08/26 13:26:53 Nit: Remove this blank line.
anitawoodruff 2013/08/26 21:45:23 Done.
468 virtual ~OneOfTwoNotificationsObserver();
469
470 // Wait until the specified condition is met. If the condition is already met
bartfab (slow) 2013/08/26 13:26:53 Nit: As above, "notification" instead of "conditio
anitawoodruff 2013/08/26 21:45:23 Done.
471 // (that is, the expected notification has already been received), Wait()
472 // returns immediately.
473 void Wait();
474
475 // NotificationObserver:
bartfab (slow) 2013/08/26 13:26:53 Nit: s/NotificationObserver/content::NotificationO
anitawoodruff 2013/08/26 21:45:23 Done.
476 virtual void Observe(int type,
477 const content::NotificationSource& source,
478 const content::NotificationDetails& details) OVERRIDE;
479
480 private:
481 bool seen_;
482 bool running_;
483 content::NotificationRegistrar registrar_;
484 scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
485
486 DISALLOW_COPY_AND_ASSIGN(OneOfTwoNotificationsObserver);
487 };
488
489 OneOfTwoNotificationsObserver::OneOfTwoNotificationsObserver(
490 int notification_type1, int notification_type2)
491 : seen_(false), running_(false) {
492 registrar_.Add(this, notification_type1,
493 content::NotificationService::AllSources());
494 registrar_.Add(this, notification_type2,
495 content::NotificationService::AllSources());
496 }
497
498 OneOfTwoNotificationsObserver::~OneOfTwoNotificationsObserver() {}
499
500 void OneOfTwoNotificationsObserver::Wait() {
501 if (seen_)
502 return;
bartfab (slow) 2013/08/26 13:26:53 Nit: Indent 2 spaces, not 4.
anitawoodruff 2013/08/26 21:45:23 Done.
503 running_ = true;
504 message_loop_runner_ = new content::MessageLoopRunner;
505 message_loop_runner_->Run();
506 EXPECT_TRUE(seen_);
507 }
508
509 // NotificationObserver:
510 void OneOfTwoNotificationsObserver::Observe(int type,
511 const content::NotificationSource& source,
512 const content::NotificationDetails& details) OVERRIDE {
513 seen_ = true;
514 if (!running_)
515 return;
516 message_loop_runner_->Quit();
517 running_ = false;
518 }
519
452 } // namespace 520 } // namespace
453 521
454 class PolicyTest : public InProcessBrowserTest { 522 class PolicyTest : public InProcessBrowserTest {
455 protected: 523 protected:
456 PolicyTest() {} 524 PolicyTest() {}
457 virtual ~PolicyTest() {} 525 virtual ~PolicyTest() {}
458 526
459 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 527 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
460 CommandLine::ForCurrentProcess()->AppendSwitch("noerrdialogs"); 528 CommandLine::ForCurrentProcess()->AppendSwitch("noerrdialogs");
461 EXPECT_CALL(provider_, IsInitializationComplete(_)) 529 EXPECT_CALL(provider_, IsInitializationComplete(_))
(...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after
1385 1453
1386 // Updating the force-installed extension. 1454 // Updating the force-installed extension.
1387 extensions::ExtensionUpdater* updater = service->updater(); 1455 extensions::ExtensionUpdater* updater = service->updater();
1388 extensions::ExtensionUpdater::CheckParams params; 1456 extensions::ExtensionUpdater::CheckParams params;
1389 params.install_immediately = true; 1457 params.install_immediately = true;
1390 content::WindowedNotificationObserver update_observer( 1458 content::WindowedNotificationObserver update_observer(
1391 chrome::NOTIFICATION_EXTENSION_INSTALLED, 1459 chrome::NOTIFICATION_EXTENSION_INSTALLED,
1392 content::NotificationService::AllSources()); 1460 content::NotificationService::AllSources());
1393 updater->CheckNow(params); 1461 updater->CheckNow(params);
1394 update_observer.Wait(); 1462 update_observer.Wait();
1395
bartfab (slow) 2013/08/26 13:26:53 Nit: Why remove the blank line?
anitawoodruff 2013/08/26 21:45:23 Done.
1396 const base::Version* new_version = 1463 const base::Version* new_version =
1397 service->GetExtensionById(kGoodCrxId, true)->version(); 1464 service->GetExtensionById(kGoodCrxId, true)->version();
1398 ASSERT_TRUE(new_version->IsValid()); 1465 ASSERT_TRUE(new_version->IsValid());
1399 base::Version old_version(old_version_number); 1466 base::Version old_version(old_version_number);
1400 ASSERT_TRUE(old_version.IsValid()); 1467 ASSERT_TRUE(old_version.IsValid());
1401 1468
1402 EXPECT_EQ(1, new_version->CompareTo(old_version)); 1469 EXPECT_EQ(1, new_version->CompareTo(old_version));
1403 1470
1404 EXPECT_EQ(0u, interceptor.GetPendingSize()); 1471 EXPECT_EQ(0u, interceptor.GetPendingSize());
1472
1473 // Wait for all the extension render view hosts that exist to finish loading.
bartfab (slow) 2013/08/26 13:26:53 Nit: Technically, this comment is correct. But it
anitawoodruff 2013/08/26 21:45:23 Done.
1474 ExtensionProcessManager* manager =
1475 extensions::ExtensionSystem::Get(browser()->profile())->process_manager();
1476 ExtensionProcessManager::ViewSet all_views = manager->GetAllViews();
1477 for (ExtensionProcessManager::ViewSet::const_iterator iter =
1478 all_views.begin();
1479 iter != all_views.end();) {
1480 if (!(*iter)->IsLoading()) {
1481 ++iter;
1482 } else {
1483 OneOfTwoNotificationsObserver(
1484 content::NOTIFICATION_LOAD_STOP,
1485 content::NOTIFICATION_WEB_CONTENTS_DESTROYED).Wait();
1486
1487 // Test activity may have modified the set of extension processes during
1488 // message processing, so re-start the iteration to catch added/removed
1489 // processes.
1490 all_views = manager->GetAllViews();
1491 iter = all_views.begin();
1492 }
1493 }
1494 // Test policy-installed extensions are reloaded when killed.
bartfab (slow) 2013/08/26 13:26:53 Nit: Add a blank line above.
anitawoodruff 2013/08/26 21:45:23 Done.
1495 BackgroundContentsService::SetCrashDelaysForTesting(
1496 base::TimeDelta::FromSeconds(0), base::TimeDelta::FromSeconds(0));
1497 content::WindowedNotificationObserver extension_crashed_observer(
1498 chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED,
1499 content::NotificationService::AllSources());
1500 content::WindowedNotificationObserver extension_loaded_observer(
1501 chrome::NOTIFICATION_EXTENSION_LOADED,
1502 content::NotificationService::AllSources());
1503 extensions::ExtensionHost* extension_host =
1504 extensions::ExtensionSystem::Get(browser()->profile())->
1505 process_manager()->GetBackgroundHostForExtension(kGoodCrxId);
1506 base::KillProcess(extension_host->render_process_host()->GetHandle(),
1507 content::RESULT_CODE_KILLED, false);
1508 extension_crashed_observer.Wait();
1509 extension_loaded_observer.Wait();
1405 } 1510 }
1406 1511
1407 IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionAllowedTypes) { 1512 IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionAllowedTypes) {
1408 // Verifies that extensions are blocked if policy specifies an allowed types 1513 // Verifies that extensions are blocked if policy specifies an allowed types
1409 // list and the extension's type is not on that list. 1514 // list and the extension's type is not on that list.
1410 ExtensionService* service = extension_service(); 1515 ExtensionService* service = extension_service();
1411 ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true)); 1516 ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
1412 ASSERT_FALSE(service->GetExtensionById(kHostedAppCrxId, true)); 1517 ASSERT_FALSE(service->GetExtensionById(kHostedAppCrxId, true));
1413 1518
1414 base::ListValue allowed_types; 1519 base::ListValue allowed_types;
(...skipping 1087 matching lines...) Expand 10 before | Expand all | Expand 10 after
2502 chrome_variations::VariationsService::GetVariationsServerURL( 2607 chrome_variations::VariationsService::GetVariationsServerURL(
2503 g_browser_process->local_state()); 2608 g_browser_process->local_state());
2504 EXPECT_TRUE(StartsWithASCII(url.spec(), default_variations_url, true)); 2609 EXPECT_TRUE(StartsWithASCII(url.spec(), default_variations_url, true));
2505 std::string value; 2610 std::string value;
2506 EXPECT_TRUE(net::GetValueForKeyInQuery(url, "restrict", &value)); 2611 EXPECT_TRUE(net::GetValueForKeyInQuery(url, "restrict", &value));
2507 EXPECT_EQ("restricted", value); 2612 EXPECT_EQ("restricted", value);
2508 } 2613 }
2509 #endif 2614 #endif
2510 2615
2511 } // namespace policy 2616 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698