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

Side by Side Diff: chrome/browser/extensions/extension_service_unittest.cc

Issue 13533007: Test extension reloading behavior. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/browser/extensions/extension_service_unittest.h" 5 #include "chrome/browser/extensions/extension_service_unittest.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 #include "chrome/common/chrome_constants.h" 61 #include "chrome/common/chrome_constants.h"
62 #include "chrome/common/chrome_notification_types.h" 62 #include "chrome/common/chrome_notification_types.h"
63 #include "chrome/common/chrome_paths.h" 63 #include "chrome/common/chrome_paths.h"
64 #include "chrome/common/chrome_switches.h" 64 #include "chrome/common/chrome_switches.h"
65 #include "chrome/common/extensions/api/i18n/default_locale_handler.h" 65 #include "chrome/common/extensions/api/i18n/default_locale_handler.h"
66 #include "chrome/common/extensions/api/plugins/plugins_handler.h" 66 #include "chrome/common/extensions/api/plugins/plugins_handler.h"
67 #include "chrome/common/extensions/background_info.h" 67 #include "chrome/common/extensions/background_info.h"
68 #include "chrome/common/extensions/extension.h" 68 #include "chrome/common/extensions/extension.h"
69 #include "chrome/common/extensions/extension_l10n_util.h" 69 #include "chrome/common/extensions/extension_l10n_util.h"
70 #include "chrome/common/extensions/extension_manifest_constants.h" 70 #include "chrome/common/extensions/extension_manifest_constants.h"
71 #include "chrome/common/extensions/extension_messages.h"
71 #include "chrome/common/extensions/manifest_handler.h" 72 #include "chrome/common/extensions/manifest_handler.h"
72 #include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" 73 #include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h"
73 #include "chrome/common/extensions/manifest_handlers/requirements_handler.h" 74 #include "chrome/common/extensions/manifest_handlers/requirements_handler.h"
74 #include "chrome/common/extensions/manifest_url_handler.h" 75 #include "chrome/common/extensions/manifest_url_handler.h"
75 #include "chrome/common/extensions/permissions/permission_set.h" 76 #include "chrome/common/extensions/permissions/permission_set.h"
76 #include "chrome/common/pref_names.h" 77 #include "chrome/common/pref_names.h"
77 #include "chrome/common/url_constants.h" 78 #include "chrome/common/url_constants.h"
78 #include "chrome/test/base/testing_profile.h" 79 #include "chrome/test/base/testing_profile.h"
79 #include "components/user_prefs/pref_registry_syncable.h" 80 #include "components/user_prefs/pref_registry_syncable.h"
80 #include "content/public/browser/dom_storage_context.h" 81 #include "content/public/browser/dom_storage_context.h"
81 #include "content/public/browser/gpu_data_manager.h" 82 #include "content/public/browser/gpu_data_manager.h"
82 #include "content/public/browser/indexed_db_context.h" 83 #include "content/public/browser/indexed_db_context.h"
83 #include "content/public/browser/notification_registrar.h" 84 #include "content/public/browser/notification_registrar.h"
84 #include "content/public/browser/notification_service.h" 85 #include "content/public/browser/notification_service.h"
85 #include "content/public/browser/plugin_service.h" 86 #include "content/public/browser/plugin_service.h"
86 #include "content/public/browser/storage_partition.h" 87 #include "content/public/browser/storage_partition.h"
87 #include "content/public/common/content_constants.h" 88 #include "content/public/common/content_constants.h"
88 #include "content/public/common/gpu_info.h" 89 #include "content/public/common/gpu_info.h"
90 #include "content/public/test/mock_render_process_host.h"
89 #include "content/public/test/test_browser_thread.h" 91 #include "content/public/test/test_browser_thread.h"
92 #include "content/public/test/test_content_client_initializer.h"
93 #include "content/public/test/test_notification_tracker.h"
90 #include "extensions/common/constants.h" 94 #include "extensions/common/constants.h"
91 #include "extensions/common/extension_resource.h" 95 #include "extensions/common/extension_resource.h"
92 #include "extensions/common/url_pattern.h" 96 #include "extensions/common/url_pattern.h"
93 #include "googleurl/src/gurl.h" 97 #include "googleurl/src/gurl.h"
94 #include "grit/browser_resources.h" 98 #include "grit/browser_resources.h"
95 #include "net/cookies/canonical_cookie.h" 99 #include "net/cookies/canonical_cookie.h"
96 #include "net/cookies/cookie_monster.h" 100 #include "net/cookies/cookie_monster.h"
97 #include "net/cookies/cookie_options.h" 101 #include "net/cookies/cookie_options.h"
98 #include "net/url_request/url_request_context.h" 102 #include "net/url_request/url_request_context.h"
99 #include "net/url_request/url_request_context_getter.h" 103 #include "net/url_request/url_request_context_getter.h"
100 #include "sync/api/string_ordinal.h" 104 #include "sync/api/string_ordinal.h"
101 #include "sync/api/sync_error_factory.h" 105 #include "sync/api/sync_error_factory.h"
102 #include "sync/api/sync_error_factory_mock.h" 106 #include "sync/api/sync_error_factory_mock.h"
103 #include "sync/protocol/app_specifics.pb.h" 107 #include "sync/protocol/app_specifics.pb.h"
104 #include "sync/protocol/extension_specifics.pb.h" 108 #include "sync/protocol/extension_specifics.pb.h"
105 #include "sync/protocol/sync.pb.h" 109 #include "sync/protocol/sync.pb.h"
110 #include "testing/gmock/include/gmock/gmock.h"
106 #include "testing/gtest/include/gtest/gtest.h" 111 #include "testing/gtest/include/gtest/gtest.h"
107 #include "testing/platform_test.h" 112 #include "testing/platform_test.h"
108 #include "webkit/database/database_tracker.h" 113 #include "webkit/database/database_tracker.h"
109 #include "webkit/database/database_util.h" 114 #include "webkit/database/database_util.h"
110 #include "webkit/plugins/npapi/mock_plugin_list.h" 115 #include "webkit/plugins/npapi/mock_plugin_list.h"
111 #include "webkit/quota/quota_manager.h" 116 #include "webkit/quota/quota_manager.h"
112 117
113 #if defined(OS_CHROMEOS) 118 #if defined(OS_CHROMEOS)
114 #include "chrome/browser/chromeos/extensions/install_limiter.h" 119 #include "chrome/browser/chromeos/extensions/install_limiter.h"
115 #endif 120 #endif
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 file_util::CopyDirectory(source_install_dir, extensions_install_dir_, true); 506 file_util::CopyDirectory(source_install_dir, extensions_install_dir_, true);
502 507
503 InitializeExtensionService(path, temp_prefs, extensions_install_dir_, false); 508 InitializeExtensionService(path, temp_prefs, extensions_install_dir_, false);
504 } 509 }
505 510
506 void ExtensionServiceTestBase::InitializeEmptyExtensionService() { 511 void ExtensionServiceTestBase::InitializeEmptyExtensionService() {
507 InitializeExtensionServiceHelper(false); 512 InitializeExtensionServiceHelper(false);
508 } 513 }
509 514
510 void ExtensionServiceTestBase::InitializeExtensionProcessManager() { 515 void ExtensionServiceTestBase::InitializeExtensionProcessManager() {
511 static_cast<extensions::TestExtensionSystem*>( 516 extensions::TestExtensionSystem* system =
512 ExtensionSystem::Get(profile_.get()))-> 517 static_cast<extensions::TestExtensionSystem*>(
513 CreateExtensionProcessManager(); 518 ExtensionSystem::Get(profile_.get()));
519 system->CreateExtensionProcessManager();
520 system->process_manager()->SetRenderProcessHostFactoryForTest(&rph_factory_);
514 } 521 }
515 522
516 void ExtensionServiceTestBase::InitializeExtensionServiceWithUpdater() { 523 void ExtensionServiceTestBase::InitializeExtensionServiceWithUpdater() {
517 InitializeExtensionServiceHelper(true); 524 InitializeExtensionServiceHelper(true);
518 service_->updater()->Start(); 525 service_->updater()->Start();
519 } 526 }
520 527
521 void ExtensionServiceTestBase::InitializeExtensionServiceHelper( 528 void ExtensionServiceTestBase::InitializeExtensionServiceHelper(
522 bool autoupdate_enabled) { 529 bool autoupdate_enabled) {
523 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 530 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
(...skipping 3081 matching lines...) Expand 10 before | Expand all | Expand 10 after
3605 // EnableExtension() call above inserted into it and 3612 // EnableExtension() call above inserted into it and
3606 // UnloadAllExtensions() doesn't send out notifications. 3613 // UnloadAllExtensions() doesn't send out notifications.
3607 loaded_.clear(); 3614 loaded_.clear();
3608 service_->ReloadExtensions(); 3615 service_->ReloadExtensions();
3609 3616
3610 // Extension counts shouldn't change. 3617 // Extension counts shouldn't change.
3611 EXPECT_EQ(1u, service_->extensions()->size()); 3618 EXPECT_EQ(1u, service_->extensions()->size());
3612 EXPECT_EQ(0u, service_->disabled_extensions()->size()); 3619 EXPECT_EQ(0u, service_->disabled_extensions()->size());
3613 } 3620 }
3614 3621
3622 std::vector<uint32> MessageTypes(const IPC::TestSink& sink) {
3623 std::vector<uint32> message_types;
3624 for (size_t i = 0; i < sink.message_count(); ++i) {
3625 message_types.push_back(sink.GetMessageAt(i)->type());
3626 }
3627 return message_types;
3628 }
3629
3630 struct ProcessObserver
3631 : public content::MockRenderProcessHostFactory::Observer {
3632 explicit ProcessObserver(content::MockRenderProcessHostFactory* factory)
3633 : Observer(factory) {}
3634
3635 ~ProcessObserver() {
3636 for (size_t i = 0; i < hosts.size(); ++i) {
3637 if (destroyed_processes.count(process_ids[i]) == 0)
3638 hosts[i]->sink().RemoveFilter(process_messages[i]);
3639 delete process_messages[i];
3640 }
3641 }
3642
3643 virtual void OnRenderProcessHostCreated(
3644 content::MockRenderProcessHost* host) {
3645 IPC::TestSink* sink = new IPC::TestSink;
3646 hosts.push_back(host);
3647 process_ids.push_back(host->GetID());
3648 process_messages.push_back(sink);
3649 host->sink().AddFilter(sink);
3650 }
3651 virtual void OnRenderProcessHostDestroyed(
3652 content::MockRenderProcessHost* host) {
3653 destroyed_processes.insert(host->GetID());
3654 }
3655
3656 std::vector<content::MockRenderProcessHost*> hosts;
3657 std::vector<int> process_ids;
3658 std::vector<IPC::TestSink*> process_messages;
3659 std::set<int> destroyed_processes;
3660 };
3661
3615 // Tests reloading an extension. 3662 // Tests reloading an extension.
3616 TEST_F(ExtensionServiceTest, ReloadExtension) { 3663 TEST_F(ExtensionServiceTest, ReloadExtension) {
3664 ProcessObserver observer(&rph_factory_);
3665
3666 content::TestNotificationTracker notifications;
3667 notifications.ListenForAll(chrome::NOTIFICATION_EXTENSIONS_READY);
Jeffrey Yasskin 2013/04/04 09:34:35 I think it makes a lot of sense to assert against
Matt Perry 2013/04/04 20:54:26 Yeah, I really like testing for notifications and
3668 notifications.ListenForAll(chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED);
3669 notifications.ListenForAll(chrome::NOTIFICATION_EXTENSION_LOADED);
3670 notifications.ListenForAll(chrome::NOTIFICATION_EXTENSION_UNLOADED);
3671 notifications.ListenForAll(content::NOTIFICATION_RENDERER_PROCESS_CLOSING);
3672 notifications.ListenForAll(content::NOTIFICATION_RENDERER_PROCESS_CREATED);
3673 notifications.ListenForAll(content::NOTIFICATION_RENDERER_PROCESS_TERMINATED);
3674 notifications.ListenForAll(
3675 content::NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW);
3676
3617 InitializeEmptyExtensionService(); 3677 InitializeEmptyExtensionService();
3618 InitializeExtensionProcessManager(); 3678 InitializeExtensionProcessManager();
3679 service_->Init();
Matt Perry 2013/04/04 20:54:26 So this test used to work without ever calling Ini
Jeffrey Yasskin 2013/04/05 13:14:01 Yep. I it required the omission, or else it hit th
3680 EXPECT_THAT(notifications.GetTypesAndReset(),
3681 testing::ElementsAre(chrome::NOTIFICATION_EXTENSIONS_READY));
3619 3682
3620 // Simple extension that should install without error. 3683 // Simple extension that should install without error.
3621 const char* extension_id = "behllobkkfkfnphdnhnkndlbkcpglgmj"; 3684 const char* extension_id = "behllobkkfkfnphdnhnkndlbkcpglgmj";
3622 base::FilePath ext = data_dir_ 3685 base::FilePath ext = data_dir_
3623 .AppendASCII("good") 3686 .AppendASCII("good")
3624 .AppendASCII("Extensions") 3687 .AppendASCII("Extensions")
3625 .AppendASCII(extension_id) 3688 .AppendASCII(extension_id)
3626 .AppendASCII("1.0.0.0"); 3689 .AppendASCII("1.0.0.0");
3627 extensions::UnpackedInstaller::Create(service_)->Load(ext); 3690 extensions::UnpackedInstaller::Create(service_)->Load(ext);
3628 loop_.RunUntilIdle(); 3691 loop_.RunUntilIdle();
3629 3692
3693 EXPECT_THAT(notifications.GetTypesAndReset(),
3694 testing::ElementsAre(chrome::NOTIFICATION_EXTENSION_LOADED));
3695 ASSERT_EQ(1u, observer.process_messages.size());
3696 {
3697 testing::Matcher<uint32> expected_types[] = {
Jeffrey Yasskin 2013/04/04 09:34:35 The long lists of notifications and message types
Matt Perry 2013/04/04 20:54:26 Some messages we probably don't care about. Might
Jeffrey Yasskin 2013/04/05 13:14:01 That's not quite right, since we want to assert th
3698 ExtensionMsg_Loaded::ID,
3699 ExtensionMsg_ActivateExtension::ID,
3700 ExtensionMsg_Loaded::ID,
Jeffrey Yasskin 2013/04/04 09:34:35 Why do we send Loaded/ActivateExtension 3 times? P
Matt Perry 2013/04/04 20:54:26 Yikes! Good find.
3701 ExtensionMsg_ActivateExtension::ID,
3702 testing::_, // ViewMsg_New::ID,
Jeffrey Yasskin 2013/04/04 09:34:35 DEPS prevents me from #including content/common/vi
3703 testing::_, // ViewMsg_AllowBindings::ID,
3704 ExtensionMsg_Loaded::ID,
3705 ExtensionMsg_ActivateExtension::ID,
3706 ExtensionMsg_NotifyRenderViewType::ID,
3707 testing::_, // ViewMsg_Close::ID,
3708 testing::_, // ViewMsg_Navigate::ID
3709 };
3710 IPC::TestSink& sink = *observer.process_messages[0];
3711 EXPECT_THAT(MessageTypes(sink), testing::ElementsAreArray(expected_types));
3712 sink.ClearMessages();
3713 }
3714
3630 EXPECT_EQ(1u, service_->extensions()->size()); 3715 EXPECT_EQ(1u, service_->extensions()->size());
3631 EXPECT_EQ(0u, service_->disabled_extensions()->size()); 3716 EXPECT_EQ(0u, service_->disabled_extensions()->size());
3632 3717
3633 service_->ReloadExtension(extension_id); 3718 service_->ReloadExtension(extension_id);
3634 3719
3720 EXPECT_THAT(notifications.GetTypesAndReset(),
3721 testing::ElementsAre(
3722 chrome::NOTIFICATION_EXTENSION_UNLOADED,
3723 content::NOTIFICATION_RENDERER_PROCESS_CLOSING,
3724 chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED,
3725 content::NOTIFICATION_RENDERER_PROCESS_TERMINATED));
3726
3727 ASSERT_EQ(1u, observer.process_messages.size());
3728 EXPECT_THAT(MessageTypes(*observer.process_messages[0]),
3729 testing::ElementsAre(testing::_ /*ViewMsg_Close::ID*/));
3730 observer.process_messages[0]->ClearMessages();
3731
3635 // Extension should be disabled now, waiting to be reloaded. 3732 // Extension should be disabled now, waiting to be reloaded.
3636 EXPECT_EQ(0u, service_->extensions()->size()); 3733 EXPECT_EQ(0u, service_->extensions()->size());
3637 EXPECT_EQ(1u, service_->disabled_extensions()->size()); 3734 EXPECT_EQ(1u, service_->disabled_extensions()->size());
3638 EXPECT_EQ(Extension::DISABLE_RELOAD, 3735 EXPECT_EQ(Extension::DISABLE_RELOAD,
3639 service_->extension_prefs()->GetDisableReasons(extension_id)); 3736 service_->extension_prefs()->GetDisableReasons(extension_id));
3640 3737
3641 // Reloading again should not crash. 3738 // Reloading again before iterating the MessageLoop should not crash and
3739 // shouldn't cause an extra reload.
Matt Perry 2013/04/04 20:54:26 I'm not sure I agree with the second half. It make
Jeffrey Yasskin 2013/04/05 13:14:01 I think that would be plausible behavior, but it w
3642 service_->ReloadExtension(extension_id); 3740 service_->ReloadExtension(extension_id);
Jeffrey Yasskin 2013/04/04 09:34:35 Commenting this line out has no effect on the test
3741 EXPECT_THAT(notifications.GetTypesAndReset(),
3742 testing::ElementsAre());
3743 ASSERT_EQ(1u, observer.process_messages.size());
3744 EXPECT_THAT(MessageTypes(*observer.process_messages[0]),
3745 testing::ElementsAre());
3746 observer.process_messages[0]->ClearMessages();
3643 3747
3644 // Finish reloading 3748 // Finish reloading
3645 loop_.RunUntilIdle(); 3749 loop_.RunUntilIdle();
3646 3750
3751 EXPECT_THAT(notifications.GetTypesAndReset(),
3752 testing::ElementsAre(
3753 chrome::NOTIFICATION_EXTENSION_LOADED,
3754 chrome::NOTIFICATION_EXTENSION_UNLOADED,
Jeffrey Yasskin 2013/04/04 09:34:35 Note the extra reload here.
3755 content::NOTIFICATION_RENDERER_PROCESS_CLOSING,
3756 chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED,
3757 content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
3758 chrome::NOTIFICATION_EXTENSION_LOADED));
3759
3760 ASSERT_EQ(3u, observer.process_messages.size());
Jeffrey Yasskin 2013/04/04 09:34:35 This should become "2" when I fix the extra-reload
3761 EXPECT_THAT(observer.destroyed_processes,
3762 testing::ElementsAre(observer.process_ids[0],
3763 observer.process_ids[1]));
3764 EXPECT_THAT(MessageTypes(*observer.process_messages[0]),
3765 testing::ElementsAre());
3766 observer.process_messages[0]->ClearMessages();
3767 {
3768 testing::Matcher<uint32> expected_types[] = {
3769 ExtensionMsg_Loaded::ID,
3770 ExtensionMsg_ActivateExtension::ID,
3771 ExtensionMsg_Loaded::ID,
3772 ExtensionMsg_ActivateExtension::ID,
3773 testing::_, // ViewMsg_New::ID,
3774 testing::_, // ViewMsg_AllowBindings::ID,
3775 ExtensionMsg_Loaded::ID,
3776 ExtensionMsg_ActivateExtension::ID,
3777 ExtensionMsg_NotifyRenderViewType::ID,
3778 testing::_, // ViewMsg_Close::ID,
3779 testing::_, // ViewMsg_Navigate::ID,
3780 testing::_, // ViewMsg_Close::ID
3781 };
3782 EXPECT_THAT(MessageTypes(*observer.process_messages[1]),
3783 testing::ElementsAreArray(expected_types));
3784 observer.process_messages[1]->ClearMessages();
3785 }
3786 {
3787 testing::Matcher<uint32> expected_types[] = {
3788 ExtensionMsg_Loaded::ID,
3789 ExtensionMsg_ActivateExtension::ID,
3790 ExtensionMsg_Loaded::ID,
3791 ExtensionMsg_ActivateExtension::ID,
3792 testing::_, // ViewMsg_New::ID
3793 testing::_, // ViewMsg_AllowBindings::ID,
3794 ExtensionMsg_Loaded::ID,
3795 ExtensionMsg_ActivateExtension::ID,
3796 ExtensionMsg_NotifyRenderViewType::ID,
3797 testing::_, // ViewMsg_Close::ID,
3798 testing::_, // ViewMsg_Navigate::ID
3799 };
3800 EXPECT_THAT(MessageTypes(*observer.process_messages[2]),
3801 testing::ElementsAreArray(expected_types));
3802 observer.process_messages[2]->ClearMessages();
3803 }
3804
3647 // Extension should be enabled again. 3805 // Extension should be enabled again.
3648 EXPECT_EQ(1u, service_->extensions()->size()); 3806 EXPECT_EQ(1u, service_->extensions()->size());
3649 EXPECT_EQ(0u, service_->disabled_extensions()->size()); 3807 EXPECT_EQ(0u, service_->disabled_extensions()->size());
3650 } 3808 }
3651 3809
3652 TEST_F(ExtensionServiceTest, UninstallExtension) { 3810 TEST_F(ExtensionServiceTest, UninstallExtension) {
3653 InitializeEmptyExtensionService(); 3811 InitializeEmptyExtensionService();
3654 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); 3812 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW);
3655 EXPECT_EQ(1u, service_->extensions()->size()); 3813 EXPECT_EQ(1u, service_->extensions()->size());
3656 UninstallExtension(good_crx, false); 3814 UninstallExtension(good_crx, false);
(...skipping 2249 matching lines...) Expand 10 before | Expand all | Expand 10 after
5906 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); 6064 EXPECT_FALSE(extensions::HasExternalInstallError(service_));
5907 EXPECT_FALSE(service_->IsExtensionEnabled(good_crx)); 6065 EXPECT_FALSE(service_->IsExtensionEnabled(good_crx));
5908 EXPECT_TRUE(service_->IsExtensionEnabled(page_action)); 6066 EXPECT_TRUE(service_->IsExtensionEnabled(page_action));
5909 6067
5910 ExtensionPrefs* prefs = service_->extension_prefs(); 6068 ExtensionPrefs* prefs = service_->extension_prefs();
5911 EXPECT_NE(0, prefs->GetDisableReasons(good_crx) & 6069 EXPECT_NE(0, prefs->GetDisableReasons(good_crx) &
5912 Extension::DISABLE_SIDELOAD_WIPEOUT); 6070 Extension::DISABLE_SIDELOAD_WIPEOUT);
5913 EXPECT_EQ(0, prefs->GetDisableReasons(page_action) & 6071 EXPECT_EQ(0, prefs->GetDisableReasons(page_action) &
5914 Extension::DISABLE_SIDELOAD_WIPEOUT); 6072 Extension::DISABLE_SIDELOAD_WIPEOUT);
5915 } 6073 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698