11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright (c) 2012 The Chromium Authors. All rights reserved.
280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// found in the LICENSE file.
480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include <algorithm>
680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include <string>
780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include <vector>
880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/bind.h"
1080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/bind_helpers.h"
1180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/callback.h"
1280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/command_line.h"
1380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/file_util.h"
1480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/files/file_enumerator.h"
1580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/files/file_path.h"
1680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/files/scoped_temp_dir.h"
1780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/memory/ref_counted.h"
1880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/path_service.h"
1980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/prefs/pref_service.h"
2080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/run_loop.h"
2180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/strings/string16.h"
2280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/strings/string_util.h"
2380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/strings/stringprintf.h"
2480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/strings/utf_string_conversions.h"
2580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/test/test_file_util.h"
2680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/time/time.h"
2780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "base/values.h"
2880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/app/chrome_command_ids.h"
2980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/autocomplete/autocomplete_controller.h"
3080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/browser_process.h"
3180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/chrome_notification_types.h"
3280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/content_settings/tab_specific_content_settings.h"
33257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "chrome/browser/devtools/devtools_window.h"
3444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "chrome/browser/download/download_prefs.h"
35257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "chrome/browser/extensions/crx_installer.h"
3680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/extensions/extension_service.h"
3780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/extensions/extension_system.h"
3880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/extensions/unpacked_installer.h"
3980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/extensions/updater/extension_updater.h"
4080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/infobars/infobar_service.h"
4180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/media/media_capture_devices_dispatcher.h"
421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/media/media_stream_devices_controller.h"
431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/metrics/variations/variations_service.h"
441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/net/url_request_mock_util.h"
45257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "chrome/browser/plugins/plugin_prefs.h"
463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "chrome/browser/policy/browser_policy_connector.h"
471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/policy/cloud/test_request_interceptor.h"
481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/policy/external_data_fetcher.h"
491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/policy/mock_configuration_policy_provider.h"
501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/policy/policy_map.h"
5144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "chrome/browser/prefs/session_startup_pref.h"
5244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "chrome/browser/profiles/profile.h"
53257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "chrome/browser/search/instant_service.h"
541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/search/instant_service_factory.h"
551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/search/search.h"
561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/search_engines/template_url.h"
571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/search_engines/template_url_service.h"
581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/search_engines/template_url_service_factory.h"
591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/translate/translate_infobar_delegate.h"
601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/translate/translate_tab_helper.h"
611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/ui/bookmarks/bookmark_bar.h"
621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/ui/browser.h"
631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "chrome/browser/ui/browser_commands.h"
6480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/ui/browser_list.h"
6580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/ui/browser_tabstrip.h"
6680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/ui/browser_window.h"
6780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/ui/host_desktop.h"
6880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/ui/omnibox/location_bar.h"
6980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/ui/omnibox/omnibox_edit_model.h"
7080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/ui/omnibox/omnibox_view.h"
7180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/browser/ui/tabs/tab_strip_model.h"
7280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/common/chrome_paths.h"
7344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "chrome/common/chrome_switches.h"
7444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "chrome/common/content_settings.h"
7544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "chrome/common/content_settings_pattern.h"
7644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "chrome/common/extensions/extension.h"
7780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/common/extensions/extension_constants.h"
7880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/common/pref_names.h"
7980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/common/url_constants.h"
8080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/test/base/in_process_browser_test.h"
8144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "chrome/test/base/test_switches.h"
8280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chrome/test/base/ui_test_utils.h"
8380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/browser/browser_child_process_host_iterator.h"
8480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/browser/browser_context.h"
8580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/browser/browser_thread.h"
8644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "content/public/browser/child_process_data.h"
8744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "content/public/browser/download_item.h"
8880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/browser/download_manager.h"
8980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/browser/notification_registrar.h"
9080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/browser/notification_service.h"
9144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "content/public/browser/notification_source.h"
9280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/browser/notification_types.h"
9380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/browser/plugin_service.h"
9480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/browser/render_process_host.h"
95b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "content/public/browser/render_view_host.h"
9644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "content/public/browser/web_contents.h"
9780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/common/content_constants.h"
9880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/common/content_paths.h"
9980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/common/page_transition_types.h"
10080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/common/process_type.h"
10180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/common/url_constants.h"
10280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/common/webplugininfo.h"
10380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/test/browser_test_utils.h"
10480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/test/download_test_observer.h"
10580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/test/mock_notification_observer.h"
10680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/test/test_navigation_observer.h"
10780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/public/test/test_utils.h"
10880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/test/net/url_request_failed_job.h"
10980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "content/test/net/url_request_mock_http_job.h"
11080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "grit/generated_resources.h"
11180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "net/base/net_errors.h"
11280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "net/base/net_util.h"
11344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "net/base/url_util.h"
11480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "net/http/http_stream_factory.h"
1158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "net/url_request/url_request.h"
11680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "net/url_request/url_request_filter.h"
11780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "policy/policy_constants.h"
11880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "testing/gmock/include/gmock/gmock.h"
11980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
12080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "third_party/WebKit/public/web/WebInputEvent.h"
12180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "ui/base/l10n/l10n_util.h"
12280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "ui/base/resource/resource_bundle.h"
12380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "url/gurl.h"
12480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
12580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#if defined(OS_CHROMEOS)
12680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "ash/accelerators/accelerator_controller.h"
12780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "ash/accelerators/accelerator_table.h"
12880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "ash/magnifier/magnifier_constants.h"
12980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "ash/shell.h"
13044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "ash/shell_delegate.h"
1313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
1323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "chrome/browser/chromeos/accessibility/magnification_manager.h"
13380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "chromeos/audio/cras_audio_handler.h"
13480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#endif
13580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
13680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenusing content::BrowserThread;
1379fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockusing content::URLRequestMockHTTPJob;
13880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenusing testing::AnyNumber;
1393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochusing testing::Mock;
14080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenusing testing::Return;
14180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenusing testing::_;
1423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochnamespace policy {
14480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
14580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsennamespace {
14680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
14744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockconst char kURL[] = "http://example.com";
14880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst char kCookieValue[] = "converted=true";
14980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// Assigned to Philip J. Fry to fix eventually.
15080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst char kCookieOptions[] = ";expires=Wed Jan 01 3000 00:00:00 GMT";
15180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
15280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst base::FilePath::CharType kTestExtensionsDir[] =
15380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    FILE_PATH_LITERAL("extensions");
15480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst base::FilePath::CharType kGoodCrxName[] = FILE_PATH_LITERAL("good.crx");
15580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst base::FilePath::CharType kAdBlockCrxName[] =
15680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    FILE_PATH_LITERAL("adblock.crx");
15780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst base::FilePath::CharType kHostedAppCrxName[] =
1583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    FILE_PATH_LITERAL("hosted_app.crx");
15980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
16080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst char kGoodCrxId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
16180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst char kAdBlockCrxId[] = "dojnnbeimaimaojcialkkgajdnefpgcn";
16280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst char kHostedAppCrxId[] = "kbmnembihfiondgfjekmnmcbddelicoi";
16380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
16480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst base::FilePath::CharType kGoodCrxManifestName[] =
16580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    FILE_PATH_LITERAL("good_update_manifest.xml");
16680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst base::FilePath::CharType kGood2CrxManifestName[] =
16780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    FILE_PATH_LITERAL("good2_update_manifest.xml");
16880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst base::FilePath::CharType kGoodV1CrxManifestName[] =
16980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    FILE_PATH_LITERAL("good_v1_update_manifest.xml");
17080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst base::FilePath::CharType kGoodUnpackedExt[] =
17180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    FILE_PATH_LITERAL("good_unpacked");
17280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenconst base::FilePath::CharType kAppUnpackedExt[] =
17380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    FILE_PATH_LITERAL("app");
17480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
17580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// Filters requests to the hosts in |urls| and redirects them to the test data
17680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// dir through URLRequestMockHTTPJobs.
17780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid RedirectHostsToTestData(const char* const urls[], size_t size) {
17880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  // Map the given hosts to the test data dir.
17980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
18080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  base::FilePath base_path;
18180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  PathService::Get(chrome::DIR_TEST_DATA, &base_path);
18280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  for (size_t i = 0; i < size; ++i) {
18344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    const GURL url(urls[i]);
18444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EXPECT_TRUE(url.is_valid());
18580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    filter->AddUrlProtocolHandler(url,
18680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        URLRequestMockHTTPJob::CreateProtocolHandler(base_path));
18780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
18880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
18980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
19080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// Remove filters for requests to the hosts in |urls|.
19180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid UndoRedirectHostsToTestData(const char* const urls[], size_t size) {
19244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Map the given hosts to the test data dir.
19380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
19480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  for (size_t i = 0; i < size; ++i) {
19580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    const GURL url(urls[i]);
19644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EXPECT_TRUE(url.is_valid());
19780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    filter->RemoveUrlHandler(url);
19880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
19980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
20080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
20180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// Fails requests using ERR_CONNECTION_RESET.
20280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsennet::URLRequestJob* FailedJobFactory(
20380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    net::URLRequest* request,
20480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    net::NetworkDelegate* network_delegate,
20580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    const std::string& scheme) {
20680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  return new content::URLRequestFailedJob(
20780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      request, network_delegate, net::ERR_CONNECTION_RESET);
20880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
20980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
21080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// While |MakeRequestFail| is in scope URLRequests to |host| will fail.
21180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenclass MakeRequestFail {
21280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen public:
21380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  // Sets up the filter on IO thread such that requests to |host| fail.
21480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  explicit MakeRequestFail(const std::string& host) : host_(host) {
21580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    BrowserThread::PostTaskAndReply(
21680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        BrowserThread::IO, FROM_HERE,
21780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::Bind(MakeRequestFailOnIO, host_),
21880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::MessageLoop::QuitClosure());
21980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    content::RunMessageLoop();
22080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
22180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  ~MakeRequestFail() {
22280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    BrowserThread::PostTaskAndReply(
22380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        BrowserThread::IO, FROM_HERE,
22480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::Bind(UndoMakeRequestFailOnIO, host_),
22580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::MessageLoop::QuitClosure());
22680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    content::RunMessageLoop();
22780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
22880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
22980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen private:
23080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  // Filters requests to the |host| such that they fail. Run on IO thread.
23180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  static void MakeRequestFailOnIO(const std::string& host) {
23280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
23380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    filter->AddHostnameHandler("http", host, &FailedJobFactory);
23480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    filter->AddHostnameHandler("https", host, &FailedJobFactory);
23580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
23680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
23780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  // Remove filters for requests to the |host|. Run on IO thread.
23880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  static void UndoMakeRequestFailOnIO(const std::string& host) {
23969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
24069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    filter->RemoveHostnameHandler("http", host);
24180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    filter->RemoveHostnameHandler("https", host);
24269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
243257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
24469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  const std::string host_;
2453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
2463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
24769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Verifies that the given url |spec| can be opened. This assumes that |spec|
24869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// points at empty.html in the test data dir.
24969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid CheckCanOpenURL(Browser* browser, const char* spec) {
250257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  GURL url(spec);
251257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::NavigateToURL(browser, url);
25269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  content::WebContents* contents =
253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      browser->tab_strip_model()->GetActiveWebContents();
254257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(url, contents->GetURL());
25569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  string16 title = UTF8ToUTF16(url.spec() + " was blocked");
25669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_NE(title, contents->GetTitle());
25780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
2583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
25969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Verifies that access to the given url |spec| is blocked.
26080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid CheckURLIsBlocked(Browser* browser, const char* spec) {
26169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  GURL url(spec);
26269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ui_test_utils::NavigateToURL(browser, url);
26369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  content::WebContents* contents =
26469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      browser->tab_strip_model()->GetActiveWebContents();
26569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_EQ(url, contents->GetURL());
26669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  string16 title = UTF8ToUTF16(url.spec() + " was blocked");
26769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_EQ(title, contents->GetTitle());
26869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
26969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Verify that the expected error page is being displayed.
27069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  bool result = false;
27169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
27269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      contents,
27369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      "var textContent = document.body.textContent;"
27469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      "var hasError = textContent.indexOf('ERR_BLOCKED_BY_ADMINISTRATOR') >= 0;"
27580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      "domAutomationController.send(hasError);",
27669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      &result));
27769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_TRUE(result);
27869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
27969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
28069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Downloads a file named |file| and expects it to be saved to |dir|, which
28169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// must be empty.
28269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid DownloadAndVerifyFile(
28369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    Browser* browser, const base::FilePath& dir, const base::FilePath& file) {
28469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  content::DownloadManager* download_manager =
28569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      content::BrowserContext::GetDownloadManager(browser->profile());
28669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  content::DownloadTestObserverTerminal observer(
28769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      download_manager, 1,
28869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
28969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
29080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  base::FilePath downloaded = dir.Append(file);
29169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_FALSE(base::PathExists(downloaded));
29269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ui_test_utils::NavigateToURLWithDisposition(
29369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      browser, url, CURRENT_TAB,
29469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
29569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  observer.WaitForFinished();
29669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_EQ(
29769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      1u, observer.NumDownloadsSeenInState(content::DownloadItem::COMPLETE));
29869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_TRUE(base::PathExists(downloaded));
29969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  base::FileEnumerator enumerator(dir, false, base::FileEnumerator::FILES);
30069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_EQ(file, enumerator.Next().BaseName());
30169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_EQ(base::FilePath(), enumerator.Next());
30269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
30380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
30469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#if defined(OS_CHROMEOS)
30569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochint CountScreenshots() {
30669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  DownloadPrefs* download_prefs = DownloadPrefs::FromBrowserContext(
30769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      ash::Shell::GetInstance()->delegate()->GetCurrentBrowserContext());
30869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  base::FileEnumerator enumerator(download_prefs->DownloadPath(),
30969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                  false, base::FileEnumerator::FILES,
31069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                  "Screenshot*");
31169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  int count = 0;
31269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  while (!enumerator.Next().empty())
31380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    count++;
31469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return count;
31569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
31669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif
31769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
31869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Checks if WebGL is enabled in the given WebContents.
31969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool IsWebGLEnabled(content::WebContents* contents) {
32069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  bool result = false;
32169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
32269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      contents,
32369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      "var canvas = document.createElement('canvas');"
32469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      "var context = canvas.getContext('experimental-webgl');"
32569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      "domAutomationController.send(context != null);",
32669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      &result));
32769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return result;
32869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
32969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
33069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool IsJavascriptEnabled(content::WebContents* contents) {
33169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  scoped_ptr<base::Value> value = content::ExecuteScriptAndGetValue(
33269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      contents->GetRenderViewHost(), "123");
33369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  int result = 0;
33469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!value->GetAsInteger(&result))
33569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    EXPECT_EQ(base::Value::TYPE_NULL, value->GetType());
33669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return result == 123;
33769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
33869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
33969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid CopyPluginListAndQuit(std::vector<content::WebPluginInfo>* out,
34069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                           const std::vector<content::WebPluginInfo>& in) {
34169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  *out = in;
34269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  base::MessageLoop::current()->QuitWhenIdle();
34369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
34469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
34569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochtemplate<typename T>
34669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid CopyValueAndQuit(T* out, T in) {
34769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  *out = in;
34869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  base::MessageLoop::current()->QuitWhenIdle();
34969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
35069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
35169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid GetPluginList(std::vector<content::WebPluginInfo>* plugins) {
35269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  content::PluginService* service = content::PluginService::GetInstance();
35369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  service->GetPlugins(base::Bind(CopyPluginListAndQuit, plugins));
35469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  content::RunMessageLoop();
35569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
35669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
35769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochconst content::WebPluginInfo* GetFlashPlugin(
35869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    const std::vector<content::WebPluginInfo>& plugins) {
35969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  const content::WebPluginInfo* flash = NULL;
36069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  for (size_t i = 0; i < plugins.size(); ++i) {
36169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    if (plugins[i].name == ASCIIToUTF16(content::kFlashPluginName)) {
36269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      flash = &plugins[i];
36369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      break;
36469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    }
36569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
36669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#if defined(OFFICIAL_BUILD)
36769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Official builds bundle Flash.
36869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EXPECT_TRUE(flash);
36969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#else
37069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!flash)
37169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    LOG(INFO) << "Test skipped because the Flash plugin couldn't be found.";
37269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif
37369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return flash;
37480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
37580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
37680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenbool SetPluginEnabled(PluginPrefs* plugin_prefs,
3778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      const content::WebPluginInfo* plugin,
3788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      bool enabled) {
3798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool ok = false;
3808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  plugin_prefs->EnablePlugin(enabled, plugin->path,
3818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                             base::Bind(CopyValueAndQuit<bool>, &ok));
3828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  content::RunMessageLoop();
38380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  return ok;
3848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
3858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochint CountPluginsOnIOThread() {
3878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int count = 0;
3888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  for (content::BrowserChildProcessHostIterator iter; !iter.Done(); ++iter) {
38980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    if (iter.GetData().process_type == content::PROCESS_TYPE_PLUGIN ||
3908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        iter.GetData().process_type == content::PROCESS_TYPE_PPAPI_PLUGIN) {
3918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      count++;
3928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    }
3938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
3948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return count;
3958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
3968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
39780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenint CountPlugins() {
3988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int count = -1;
3998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  BrowserThread::PostTaskAndReplyWithResult(
4008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      BrowserThread::IO, FROM_HERE,
401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      base::Bind(CountPluginsOnIOThread),
4028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      base::Bind(CopyValueAndQuit<int>, &count));
4038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  content::RunMessageLoop();
4048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  EXPECT_GE(count, 0);
4058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return count;
4068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
4078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid FlushBlacklistPolicy() {
4098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Updates of the URLBlacklist are done on IO, after building the blacklist
4108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // on FILE, which is initiated from IO.
4118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  content::RunAllPendingInMessageLoop(BrowserThread::IO);
4128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  content::RunAllPendingInMessageLoop(BrowserThread::FILE);
413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::RunAllPendingInMessageLoop(BrowserThread::IO);
4148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
4158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
4168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochbool ContainsVisibleElement(content::WebContents* contents,
4178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                            const std::string& id) {
4188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool result;
419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
4208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      contents,
4218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      "var elem = document.getElementById('" + id + "');"
4228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      "domAutomationController.send(!!elem && !elem.hidden);",
4238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      &result));
4248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return result;
4258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
4268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#if defined(OS_CHROMEOS)
4288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass TestAudioObserver : public chromeos::CrasAudioHandler::AudioObserver {
4298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
4308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  TestAudioObserver() : output_mute_changed_count_(0) {
4318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int output_mute_changed_count() const {
4348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return output_mute_changed_count_;
4358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
4368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
4378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  virtual ~TestAudioObserver() {}
438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch protected:
4408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // chromeos::CrasAudioHandler::AudioObserver overrides.
4418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  virtual void OnOutputMuteChanged() OVERRIDE {
442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ++output_mute_changed_count_;
443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int output_mute_changed_count_;
447257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
448257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TestAudioObserver);
449257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
450257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif
451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}  // namespace
453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass PolicyTest : public InProcessBrowserTest {
455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PolicyTest() {}
457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual ~PolicyTest() {}
458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
460257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    CommandLine::ForCurrentProcess()->AppendSwitch("noerrdialogs");
461257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EXPECT_CALL(provider_, IsInitializationComplete(_))
462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        .WillRepeatedly(Return(true));
463257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EXPECT_CALL(provider_, RegisterPolicyDomain(_)).Times(AnyNumber());
464257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
466257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
467257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual void SetUpOnMainThread() OVERRIDE {
468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    BrowserThread::PostTask(
469257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        BrowserThread::IO, FROM_HERE,
470257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        base::Bind(chrome_browser_net::SetUrlRequestMocksEnabled, true));
471257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
472257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Makes URLRequestMockHTTPJobs serve data from content::DIR_TEST_DATA
474257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // instead of chrome::DIR_TEST_DATA.
475257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void ServeContentTestData() {
476257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    base::FilePath root_http;
477257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    PathService::Get(content::DIR_TEST_DATA, &root_http);
478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    BrowserThread::PostTaskAndReply(
479257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        BrowserThread::IO, FROM_HERE,
480257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        base::Bind(URLRequestMockHTTPJob::AddUrlHandler, root_http),
481257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        base::MessageLoop::current()->QuitWhenIdleClosure());
482257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    content::RunMessageLoop();
483257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
484257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
485257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void SetScreenshotPolicy(bool enabled) {
486257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    PolicyMap policies;
487257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    policies.Set(key::kDisableScreenshots,
488257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                 POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
489257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                 base::Value::CreateBooleanValue(!enabled), NULL);
490257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    UpdateProviderPolicy(policies);
491257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
492257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void TestScreenshotFeedback(bool enabled) {
494257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetScreenshotPolicy(enabled);
495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
49669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Wait for feedback page to load.
497257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    content::WindowedNotificationObserver observer(
498257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        content::NOTIFICATION_LOAD_STOP,
49969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        content::NotificationService::AllSources());
500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_FEEDBACK));
501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    observer.Wait();
502257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    content::WebContents* web_contents =
503257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        static_cast<content::Source<content::NavigationController> >(
504257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            observer.source())->GetWebContents();
505257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
506257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // Wait for feedback page to fully initialize.
507257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // setupCurrentScreenshot is called when feedback page loads and (among
508257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // other things) adds current-screenshots-thumbnailDiv-0-image element.
509257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // The code below executes either before setupCurrentScreenshot was called
510257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // (setupCurrentScreenshot is replaced with our hook) or after it has
511257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // completed (in that case send result immediately).
512257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    bool result = false;
513257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
514257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        web_contents,
515257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "function btest_initCompleted(url) {"
516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "  var img = new Image();"
517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "  img.src = url;"
518257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "  img.onload = function() {"
519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "    domAutomationController.send(img.width * img.height > 0);"
520257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "  };"
521257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "  img.onerror = function() {"
522257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "    domAutomationController.send(false);"
523257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "  };"
524257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "}"
525257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "function setupCurrentScreenshot(url) {"
526257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "  btest_initCompleted(url);"
527257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "}"
52869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        "var img = document.getElementById("
529257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "    'current-screenshots-thumbnailDiv-0-image');"
53069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        "if (img)"
531257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        "  btest_initCompleted(img.src);",
532257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        &result));
533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EXPECT_EQ(enabled, result);
534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // Feedback page is a singleton page, so close so future calls to this
536257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // function work as expected.
537257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    web_contents->Close();
538257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
539257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
540257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#if defined(OS_CHROMEOS)
541257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void TestScreenshotFile(bool enabled) {
542257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetScreenshotPolicy(enabled);
54369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    ash::Shell::GetInstance()->accelerator_controller()->PerformAction(
544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        ash::TAKE_SCREENSHOT, ui::Accelerator());
545257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // TAKE_SCREENSHOT handler posts write file task on success, wait for it.
547257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    BrowserThread::PostTaskAndReply(
548257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        BrowserThread::IO,
549257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        FROM_HERE,
550257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        base::Bind(base::DoNothing),
551257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        base::MessageLoop::QuitClosure());
552257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    content::RunMessageLoop();
553257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
554257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif
555257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ExtensionService* extension_service() {
557257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    extensions::ExtensionSystem* system =
558257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        extensions::ExtensionSystem::Get(browser()->profile());
559257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return system->extension_service();
560257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
561257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
562257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const extensions::Extension* InstallExtension(
563257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      const base::FilePath::StringType& name) {
564257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    base::FilePath extension_path(ui_test_utils::GetTestFilePath(
565257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        base::FilePath(kTestExtensionsDir), base::FilePath(name)));
566257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    scoped_refptr<extensions::CrxInstaller> installer =
567257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        extensions::CrxInstaller::CreateSilent(extension_service());
568257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    installer->set_allow_silent_install(true);
569257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE);
570257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    installer->set_creation_flags(extensions::Extension::FROM_WEBSTORE);
571257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
572257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    content::WindowedNotificationObserver observer(
573257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        chrome::NOTIFICATION_CRX_INSTALLER_DONE,
574257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        content::NotificationService::AllSources());
575257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    installer->InstallCrx(extension_path);
576257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    observer.Wait();
577257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    content::Details<const extensions::Extension> details = observer.details();
578257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return details.ptr();
579257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
580257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
581257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void LoadUnpackedExtension(
582257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      const base::FilePath::StringType& name, bool expect_success) {
583257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    base::FilePath extension_path(ui_test_utils::GetTestFilePath(
584257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        base::FilePath(kTestExtensionsDir), base::FilePath(name)));
585257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    scoped_refptr<extensions::UnpackedInstaller> installer =
5863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        extensions::UnpackedInstaller::Create(extension_service());
587257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    content::WindowedNotificationObserver observer(
588257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        expect_success ? chrome::NOTIFICATION_EXTENSION_LOADED
589257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                       : chrome::NOTIFICATION_EXTENSION_LOAD_ERROR,
590257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        content::NotificationService::AllSources());
591257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    installer->Load(extension_path);
592257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    observer.Wait();
5933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
5943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
5953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void UninstallExtension(const std::string& id, bool expect_success) {
5963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    content::WindowedNotificationObserver observer(
597257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        expect_success ? chrome::NOTIFICATION_EXTENSION_UNINSTALLED
598257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                       : chrome::NOTIFICATION_EXTENSION_UNINSTALL_NOT_ALLOWED,
599257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        content::NotificationService::AllSources());
600257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    extension_service()->UninstallExtension(id, false, NULL);
601257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    observer.Wait();
602257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
603257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
604257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void UpdateProviderPolicy(const PolicyMap& policy) {
605257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    provider_.UpdateChromePolicy(policy);
606257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    DCHECK(base::MessageLoop::current());
607257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    base::RunLoop loop;
608257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    loop.RunUntilIdle();
609257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
610257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
611257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Sends a mouse click at the given coordinates to the current renderer.
612257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PerformClick(int x, int y) {
613257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    content::WebContents* contents =
614257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        browser()->tab_strip_model()->GetActiveWebContents();
615257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    WebKit::WebMouseEvent click_event;
616257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    click_event.type = WebKit::WebInputEvent::MouseDown;
617257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    click_event.button = WebKit::WebMouseEvent::ButtonLeft;
618257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    click_event.clickCount = 1;
619257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    click_event.x = x;
620257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    click_event.y = y;
6213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    contents->GetRenderViewHost()->ForwardMouseEvent(click_event);
6223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    click_event.type = WebKit::WebInputEvent::MouseUp;
623257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    contents->GetRenderViewHost()->ForwardMouseEvent(click_event);
6243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
625257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
626257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  MockConfigurationPolicyProvider provider_;
627257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
628257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
629257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#if defined(OS_WIN)
630257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// This policy only exists on Windows.
631257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Sets the locale policy before the browser is started.
633257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LocalePolicyTest : public PolicyTest {
634257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
635257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LocalePolicyTest() {}
636257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual ~LocalePolicyTest() {}
637257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
638257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
639257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    PolicyTest::SetUpInProcessBrowserTestFixture();
640257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    PolicyMap policies;
641257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    policies.Set(
642257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        key::kApplicationLocaleValue, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
643257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        base::Value::CreateStringValue("fr"), NULL);
644257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    provider_.UpdateChromePolicy(policies);
645257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // The "en-US" ResourceBundle is always loaded before this step for tests,
646257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // but in this test we want the browser to load the bundle as it
647257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // normally would.
648257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ResourceBundle::CleanupSharedInstance();
649257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
650257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_F(LocalePolicyTest, ApplicationLocaleValue) {
653257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verifies that the default locale can be overridden with policy.
654257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ("fr", g_browser_process->GetApplicationLocale());
655257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
656257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  string16 french_title = l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE);
657257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  string16 title;
658257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &title));
659257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(french_title, title);
660257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
661257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Make sure this is really French and differs from the English title.
662257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  std::string loaded =
663257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      ui::ResourceBundle::GetSharedInstance().ReloadLocaleResources("en-US");
664257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ("en-US", loaded);
665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  string16 english_title = l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE);
666257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_NE(french_title, english_title);
667257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif
669257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
670257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, BookmarkBarEnabled) {
671257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
673257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
674257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return;
675257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif
676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
677257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verifies that the bookmarks bar can be forced to always or never show up.
678257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Test starts in about:blank.
680257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PrefService* prefs = browser()->profile()->GetPrefs();
681257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(prefs->IsManagedPreference(prefs::kShowBookmarkBar));
682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(prefs->GetBoolean(prefs::kShowBookmarkBar));
683257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
684257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
685257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PolicyMap policies;
686257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kBookmarkBarEnabled, POLICY_LEVEL_MANDATORY,
687257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
688257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UpdateProviderPolicy(policies);
689257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(prefs->IsManagedPreference(prefs::kShowBookmarkBar));
690257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(prefs->GetBoolean(prefs::kShowBookmarkBar));
691257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
692257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
693257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // The NTP has special handling of the bookmark bar.
694257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
695257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
697257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kBookmarkBarEnabled, POLICY_LEVEL_MANDATORY,
698257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL);
6993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  UpdateProviderPolicy(policies);
700257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(prefs->IsManagedPreference(prefs::kShowBookmarkBar));
701257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(prefs->GetBoolean(prefs::kShowBookmarkBar));
702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // The bookmark bar is hidden in the NTP when disabled by policy.
703257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
705257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Clear();
706257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UpdateProviderPolicy(policies);
707257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(prefs->IsManagedPreference(prefs::kShowBookmarkBar));
708257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(prefs->GetBoolean(prefs::kShowBookmarkBar));
709257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // The bookmark bar is shown detached in the NTP, when disabled by prefs only.
710257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(BookmarkBar::DETACHED, browser()->bookmark_bar_state());
711257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
712257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
713257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, PRE_PRE_DefaultCookiesSetting) {
714257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verifies that cookies are deleted on shutdown. This test is split in 3
715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // parts because it spans 2 browser restarts.
716257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
717257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Profile* profile = browser()->profile();
718257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  GURL url(kURL);
719257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // No cookies at startup.
720257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(content::GetCookies(profile, url).empty());
721257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Set a cookie now.
722257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  std::string value = std::string(kCookieValue) + std::string(kCookieOptions);
723257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(content::SetCookie(profile, url, value));
724257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verify it was set.
725257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(kCookieValue, GetCookies(profile, url));
726257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
727257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
728257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, PRE_DefaultCookiesSetting) {
729257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verify that the cookie persists across restarts.
730257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(kCookieValue, GetCookies(browser()->profile(), GURL(kURL)));
731257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Now set the policy and the cookie should be gone after another restart.
732257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PolicyMap policies;
733257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kDefaultCookiesSetting, POLICY_LEVEL_MANDATORY,
734257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateIntegerValue(4), NULL);
735257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UpdateProviderPolicy(policies);
736257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
737257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
738257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, DefaultCookiesSetting) {
739257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verify that the cookie is gone.
740257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(GetCookies(browser()->profile(), GURL(kURL)).empty());
741257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
742257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
743257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, DefaultSearchProvider) {
744257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  MakeRequestFail make_request_fail("search.example");
745257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
746257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verifies that a default search is made using the provider configured via
747257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // policy. Also checks that default search can be completely disabled.
748257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const string16 kKeyword(ASCIIToUTF16("testsearch"));
749257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const std::string kSearchURL("http://search.example/search?q={searchTerms}");
750257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const std::string kAlternateURL0(
751257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      "http://search.example/search#q={searchTerms}");
752257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const std::string kAlternateURL1("http://search.example/#q={searchTerms}");
753257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const std::string kSearchTermsReplacementKey("zekey");
754257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const std::string kImageURL("http://test.com/searchbyimage/upload");
755257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const std::string kImageURLPostParams(
756257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      "image_content=content,image_url=http://test.com/test.png");
757257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
758257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  TemplateURLService* service = TemplateURLServiceFactory::GetForProfile(
759257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      browser()->profile());
760257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::WaitForTemplateURLServiceToLoad(service);
761257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  TemplateURL* default_search = service->GetDefaultSearchProvider();
762257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT_TRUE(default_search);
763257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_NE(kKeyword, default_search->keyword());
764257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_NE(kSearchURL, default_search->url());
765257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(
766257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    default_search->alternate_urls().size() == 2 &&
767257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    default_search->alternate_urls()[0] == kAlternateURL0 &&
76869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    default_search->alternate_urls()[1] == kAlternateURL1 &&
769257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    default_search->search_terms_replacement_key() ==
770257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        kSearchTermsReplacementKey &&
771257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    default_search->image_url() == kImageURL &&
772257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    default_search->image_url_post_params() == kImageURLPostParams);
773257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
774257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Override the default search provider using policies.
775257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PolicyMap policies;
776257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kDefaultSearchProviderEnabled, POLICY_LEVEL_MANDATORY,
777257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
778257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kDefaultSearchProviderKeyword,
779257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
780257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               base::Value::CreateStringValue(kKeyword), NULL);
781257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kDefaultSearchProviderSearchURL,
782257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
783257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               base::Value::CreateStringValue(kSearchURL), NULL);
784257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  base::ListValue* alternate_urls = new base::ListValue();
785257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  alternate_urls->AppendString(kAlternateURL0);
786257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  alternate_urls->AppendString(kAlternateURL1);
787257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kDefaultSearchProviderAlternateURLs, POLICY_LEVEL_MANDATORY,
788257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_SCOPE_USER, alternate_urls, NULL);
789257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kDefaultSearchProviderSearchTermsReplacementKey,
790257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
791257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               base::Value::CreateStringValue(kSearchTermsReplacementKey),
792257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               NULL);
793257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kDefaultSearchProviderImageURL,
794257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
795257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               base::Value::CreateStringValue(kImageURL),
796257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               NULL);
797257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kDefaultSearchProviderImageURLPostParams,
798257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
799257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               base::Value::CreateStringValue(kImageURLPostParams),
800257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               NULL);
801257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UpdateProviderPolicy(policies);
802257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  default_search = service->GetDefaultSearchProvider();
803257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT_TRUE(default_search);
804257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(kKeyword, default_search->keyword());
805257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(kSearchURL, default_search->url());
806257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(2U, default_search->alternate_urls().size());
807257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(kAlternateURL0, default_search->alternate_urls()[0]);
808257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(kAlternateURL1, default_search->alternate_urls()[1]);
809257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(kSearchTermsReplacementKey,
810257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            default_search->search_terms_replacement_key());
811257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(kImageURL, default_search->image_url());
812257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(kImageURLPostParams, default_search->image_url_post_params());
813257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
814257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verify that searching from the omnibox uses kSearchURL.
815257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  chrome::FocusLocationBar(browser());
816257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LocationBar* location_bar = browser()->window()->GetLocationBar();
817257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::SendToOmniboxAndSubmit(location_bar, "stuff to search for");
818257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  OmniboxEditModel* model = location_bar->GetLocationEntry()->model();
819257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(model->CurrentMatch(NULL).destination_url.is_valid());
820257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::WebContents* web_contents =
821257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
822257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  GURL expected("http://search.example/search?q=stuff+to+search+for");
823257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(expected, web_contents->GetURL());
824257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
825257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verify that searching from the omnibox can be disabled.
826257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
827257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kDefaultSearchProviderEnabled, POLICY_LEVEL_MANDATORY,
828257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL);
829257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(service->GetDefaultSearchProvider());
830257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UpdateProviderPolicy(policies);
831257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(service->GetDefaultSearchProvider());
832257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::SendToOmniboxAndSubmit(location_bar, "should not work");
833257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // This means that submitting won't trigger any action.
834257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(model->CurrentMatch(NULL).destination_url.is_valid());
835257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(GURL(content::kAboutBlankURL), web_contents->GetURL());
836257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
837257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
838257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, ForceSafeSearch) {
839257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Makes the requests fail since all we want to check is that the redirection
840257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // is done properly.
841257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  MakeRequestFail make_request_fail("google.com");
842257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
843257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verifies that requests to Google Search engine with the SafeSearch
844257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // enabled set the safe=active&ssui=on parameters at the end of the query.
845257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  TemplateURLService* service = TemplateURLServiceFactory::GetForProfile(
846257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      browser()->profile());
847257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::WaitForTemplateURLServiceToLoad(service);
848257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
849257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // First check that nothing happens.
850257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::TestNavigationObserver no_safesearch_observer(
851257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents());
852257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  chrome::FocusLocationBar(browser());
853257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LocationBar* location_bar = browser()->window()->GetLocationBar();
854257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::SendToOmniboxAndSubmit(location_bar, "http://google.com/");
855257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  OmniboxEditModel* model = location_bar->GetLocationEntry()->model();
856257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  no_safesearch_observer.Wait();
857257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(model->CurrentMatch(NULL).destination_url.is_valid());
858257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::WebContents* web_contents =
859257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
860257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  GURL expected_without("http://google.com/");
861257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(expected_without, web_contents->GetURL());
862257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
863257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PrefService* prefs = browser()->profile()->GetPrefs();
864257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(prefs->IsManagedPreference(prefs::kForceSafeSearch));
865257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(prefs->GetBoolean(prefs::kForceSafeSearch));
866257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
867257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Override the default SafeSearch setting using policies.
868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PolicyMap policies;
869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kForceSafeSearch, POLICY_LEVEL_MANDATORY,
870257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
871257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UpdateProviderPolicy(policies);
872257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
873257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(prefs->IsManagedPreference(prefs::kForceSafeSearch));
874257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(prefs->GetBoolean(prefs::kForceSafeSearch));
875257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
876257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::TestNavigationObserver safesearch_observer(
877257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents());
878257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
879257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verify that searching from google.com works.
880257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  chrome::FocusLocationBar(browser());
881257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  location_bar = browser()->window()->GetLocationBar();
882257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::SendToOmniboxAndSubmit(location_bar, "http://google.com/");
883257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  safesearch_observer.Wait();
884257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  model = location_bar->GetLocationEntry()->model();
885257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(model->CurrentMatch(NULL).destination_url.is_valid());
886257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  web_contents = browser()->tab_strip_model()->GetActiveWebContents();
887257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  std::string expected_url("http://google.com/?");
888257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  expected_url += std::string(chrome::kSafeSearchSafeParameter) + "&" +
889257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                  chrome::kSafeSearchSsuiParameter;
890257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  GURL expected_with_parameters(expected_url);
891257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(expected_with_parameters, web_contents->GetURL());
892257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
893257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
894257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, ReplaceSearchTerms) {
895257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  MakeRequestFail make_request_fail("search.example");
896257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
897257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  chrome::EnableInstantExtendedAPIForTesting();
898257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
899257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verifies that a default search is made using the provider configured via
900257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // policy. Also checks that default search can be completely disabled.
901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const string16 kKeyword(ASCIIToUTF16("testsearch"));
902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const std::string kSearchURL("https://www.google.com/search?q={searchTerms}");
903257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const std::string kInstantURL("http://does/not/exist");
904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const std::string kAlternateURL0(
905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "https://www.google.com/search#q={searchTerms}");
906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const std::string kAlternateURL1("https://www.google.com/#q={searchTerms}");
907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const std::string kSearchTermsReplacementKey(
908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "{google:instantExtendedEnabledKey}");
909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TemplateURLService* service = TemplateURLServiceFactory::GetForProfile(
911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->profile());
912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::WaitForTemplateURLServiceToLoad(service);
913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TemplateURL* default_search = service->GetDefaultSearchProvider();
914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(default_search);
915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_NE(kKeyword, default_search->keyword());
916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_NE(kSearchURL, default_search->url());
917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_NE(kInstantURL, default_search->instant_url());
918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(
919257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    default_search->alternate_urls().size() == 2 &&
92044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    default_search->alternate_urls()[0] == kAlternateURL0 &&
921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    default_search->alternate_urls()[1] == kAlternateURL1);
922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Override the default search provider using policies.
924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDefaultSearchProviderEnabled, POLICY_LEVEL_MANDATORY,
926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDefaultSearchProviderKeyword,
928257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateStringValue(kKeyword), NULL);
930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDefaultSearchProviderSearchURL,
931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateStringValue(kSearchURL), NULL);
933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDefaultSearchProviderInstantURL,
934b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateStringValue(kInstantURL), NULL);
936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue* alternate_urls = new base::ListValue();
937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  alternate_urls->AppendString(kAlternateURL0);
938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  alternate_urls->AppendString(kAlternateURL1);
939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDefaultSearchProviderAlternateURLs, POLICY_LEVEL_MANDATORY,
940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, alternate_urls, NULL);
941b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDefaultSearchProviderSearchTermsReplacementKey,
942257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block               base::Value::CreateStringValue(kSearchTermsReplacementKey),
944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               NULL);
945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  default_search = service->GetDefaultSearchProvider();
947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(default_search);
948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(kKeyword, default_search->keyword());
949257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(kSearchURL, default_search->url());
950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(kInstantURL, default_search->instant_url());
951257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(2U, default_search->alternate_urls().size());
952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(kAlternateURL0, default_search->alternate_urls()[0]);
953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(kAlternateURL1, default_search->alternate_urls()[1]);
954257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Query terms replacement requires that the renderer process be a recognized
956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Instant renderer. Fake it.
957257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  InstantService* instant_service =
958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      InstantServiceFactory::GetForProfile(browser()->profile());
959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  instant_service->AddInstantProcess(browser()->tab_strip_model()->
960257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      GetActiveWebContents()->GetRenderProcessHost()->GetID());
961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that searching from the omnibox does search term replacement with
963257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // first URL pattern.
96444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  chrome::FocusLocationBar(browser());
96544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LocationBar* location_bar = browser()->window()->GetLocationBar();
966257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::SendToOmniboxAndSubmit(location_bar,
967257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      "https://www.google.com/?espv=1#q=foobar");
968257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(
969257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      browser()->toolbar_model()->WouldReplaceSearchURLWithSearchTerms(false));
970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(ASCIIToUTF16("foobar"),
971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            location_bar->GetLocationEntry()->GetText());
972257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that not using espv=1 does not do search term replacement.
974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  chrome::FocusLocationBar(browser());
975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  location_bar = browser()->window()->GetLocationBar();
976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::SendToOmniboxAndSubmit(location_bar,
977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "https://www.google.com/?q=foobar");
978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(
979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->toolbar_model()->WouldReplaceSearchURLWithSearchTerms(false));
980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(ASCIIToUTF16("https://www.google.com/?q=foobar"),
9813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            location_bar->GetLocationEntry()->GetText());
982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that searching from the omnibox does search term replacement with
984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // second URL pattern.
985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  chrome::FocusLocationBar(browser());
986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::SendToOmniboxAndSubmit(location_bar,
987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "https://www.google.com/search?espv=1#q=banana");
988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(
989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->toolbar_model()->WouldReplaceSearchURLWithSearchTerms(false));
9903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EXPECT_EQ(ASCIIToUTF16("banana"),
9913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            location_bar->GetLocationEntry()->GetText());
9923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
9933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Verify that searching from the omnibox does search term replacement with
994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // standard search URL pattern.
995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  chrome::FocusLocationBar(browser());
996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::SendToOmniboxAndSubmit(location_bar,
997257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      "https://www.google.com/search?q=tractor+parts&espv=1");
998257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(
999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->toolbar_model()->WouldReplaceSearchURLWithSearchTerms(false));
1000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(ASCIIToUTF16("tractor parts"),
1001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            location_bar->GetLocationEntry()->GetText());
1002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that searching from the omnibox prioritizes hash over query.
1004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  chrome::FocusLocationBar(browser());
1005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::SendToOmniboxAndSubmit(location_bar,
1006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "https://www.google.com/search?q=tractor+parts&espv=1#q=foobar");
1007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(
1008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->toolbar_model()->WouldReplaceSearchURLWithSearchTerms(false));
1009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(ASCIIToUTF16("foobar"),
1010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            location_bar->GetLocationEntry()->GetText());
1011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// The linux and win  bots can't create a GL context. http://crbug.com/103379
1014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#if defined(OS_MACOSX)
1015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, Disable3DAPIs) {
1016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
1017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // WebGL is enabled by default.
1018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WebContents* contents =
1019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
1020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(IsWebGLEnabled(contents));
1021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Disable with a policy.
1022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDisable3DAPIs, POLICY_LEVEL_MANDATORY,
1024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
1025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Crash and reload the tab to get a new renderer.
1027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::CrashTab(contents);
1028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_RELOAD));
1029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(IsWebGLEnabled(contents));
1030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Enable with a policy.
1031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDisable3DAPIs, POLICY_LEVEL_MANDATORY,
1032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL);
1033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::CrashTab(contents);
1035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_RELOAD));
1036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(IsWebGLEnabled(contents));
1037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, DisableSpdy) {
1041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that SPDY can be disable by policy.
1042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(net::HttpStreamFactory::spdy_enabled());
1043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDisableSpdy, POLICY_LEVEL_MANDATORY,
1045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
1046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::RunAllPendingInMessageLoop();
1048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(net::HttpStreamFactory::spdy_enabled());
1049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that it can be force-enabled too.
1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  browser()->profile()->GetPrefs()->SetBoolean(prefs::kDisableSpdy, true);
1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDisableSpdy, POLICY_LEVEL_MANDATORY,
1052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL);
1053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::RunAllPendingInMessageLoop();
1055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(net::HttpStreamFactory::spdy_enabled());
1056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
10573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, DisabledPlugins) {
1059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that plugins can be forced to be disabled by policy.
1060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that the Flash plugin exists and that it can be enabled and disabled
1062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // by the user.
1063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  std::vector<content::WebPluginInfo> plugins;
1064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  GetPluginList(&plugins);
1065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const content::WebPluginInfo* flash = GetFlashPlugin(plugins);
1066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!flash)
1067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return;
1068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PluginPrefs* plugin_prefs =
1069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      PluginPrefs::GetForProfile(browser()->profile()).get();
1070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(plugin_prefs->IsPluginEnabled(*flash));
1071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(SetPluginEnabled(plugin_prefs, flash, false));
1072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(plugin_prefs->IsPluginEnabled(*flash));
1073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(SetPluginEnabled(plugin_prefs, flash, true));
1074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(plugin_prefs->IsPluginEnabled(*flash));
1075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Now disable it with a policy.
1077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue disabled_plugins;
1078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  disabled_plugins.Append(base::Value::CreateStringValue("*Flash*"));
1079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDisabledPlugins, POLICY_LEVEL_MANDATORY,
1081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, disabled_plugins.DeepCopy(), NULL);
1082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(plugin_prefs->IsPluginEnabled(*flash));
1084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The user shouldn't be able to enable it.
1085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(SetPluginEnabled(plugin_prefs, flash, true));
1086257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(plugin_prefs->IsPluginEnabled(*flash));
1087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, DisabledPluginsExceptions) {
1090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that plugins with an exception in the blacklist can be enabled.
1091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that the Flash plugin exists and that it can be enabled and disabled
1093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // by the user.
1094b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  std::vector<content::WebPluginInfo> plugins;
1095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  GetPluginList(&plugins);
1096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const content::WebPluginInfo* flash = GetFlashPlugin(plugins);
1097b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!flash)
1098b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return;
1099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PluginPrefs* plugin_prefs =
1100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      PluginPrefs::GetForProfile(browser()->profile()).get();
1101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(plugin_prefs->IsPluginEnabled(*flash));
1102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Disable all plugins.
1104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue disabled_plugins;
1105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  disabled_plugins.Append(base::Value::CreateStringValue("*"));
1106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDisabledPlugins, POLICY_LEVEL_MANDATORY,
1108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, disabled_plugins.DeepCopy(), NULL);
1109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(plugin_prefs->IsPluginEnabled(*flash));
1111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The user shouldn't be able to enable it.
1112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(SetPluginEnabled(plugin_prefs, flash, true));
1113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(plugin_prefs->IsPluginEnabled(*flash));
1114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Now open an exception for flash.
1116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  base::ListValue disabled_plugins_exceptions;
1117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  disabled_plugins_exceptions.Append(
1118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      base::Value::CreateStringValue("*Flash*"));
1119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDisabledPluginsExceptions, POLICY_LEVEL_MANDATORY,
1120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, disabled_plugins_exceptions.DeepCopy(), NULL);
1121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // It should revert to the user's preference automatically.
1123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(plugin_prefs->IsPluginEnabled(*flash));
1124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // And the user should be able to disable and enable again.
1125257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(SetPluginEnabled(plugin_prefs, flash, false));
1126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(plugin_prefs->IsPluginEnabled(*flash));
1127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(SetPluginEnabled(plugin_prefs, flash, true));
1128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(plugin_prefs->IsPluginEnabled(*flash));
1129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1130257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, EnabledPlugins) {
1132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that a plugin can be force-installed with a policy.
1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  std::vector<content::WebPluginInfo> plugins;
1134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  GetPluginList(&plugins);
1135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const content::WebPluginInfo* flash = GetFlashPlugin(plugins);
1136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!flash)
1137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return;
1138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PluginPrefs* plugin_prefs =
1139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      PluginPrefs::GetForProfile(browser()->profile()).get();
1140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(plugin_prefs->IsPluginEnabled(*flash));
1141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The user disables it and then a policy forces it to be enabled.
1143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(SetPluginEnabled(plugin_prefs, flash, false));
1144257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(plugin_prefs->IsPluginEnabled(*flash));
1145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue plugin_list;
1146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  plugin_list.Append(base::Value::CreateStringValue(content::kFlashPluginName));
1147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kEnabledPlugins, POLICY_LEVEL_MANDATORY,
1149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, plugin_list.DeepCopy(), NULL);
1150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(plugin_prefs->IsPluginEnabled(*flash));
1152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The user can't disable it anymore.
1153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(SetPluginEnabled(plugin_prefs, flash, false));
1154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(plugin_prefs->IsPluginEnabled(*flash));
1155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // When a plugin is both enabled and disabled, the whitelist takes precedence.
1157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDisabledPlugins, POLICY_LEVEL_MANDATORY,
1158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, plugin_list.DeepCopy(), NULL);
1159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(plugin_prefs->IsPluginEnabled(*flash));
1161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, AlwaysAuthorizePlugins) {
1164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that dangerous plugins can be always authorized to run with
1165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // a policy.
1166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that the test page exists. It is only present in checkouts with
1168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // src-internal.
1169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!base::PathExists(ui_test_utils::GetTestFilePath(
1170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("plugin")),
1171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("quicktime.html"))))) {
1172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    LOG(INFO) <<
1173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        "Test skipped because plugin/quicktime.html test file wasn't found.";
1174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return;
1175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ServeContentTestData();
1178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // No plugins at startup.
1179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(0, CountPlugins());
1180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WebContents* contents =
1182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
1183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(contents);
1184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InfoBarService* infobar_service = InfoBarService::FromWebContents(contents);
1185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(infobar_service);
1186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(0u, infobar_service->infobar_count());
1187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::FilePath path(FILE_PATH_LITERAL("plugin/quicktime.html"));
1189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  GURL url(URLRequestMockHTTPJob::GetMockUrl(path));
1190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // This should have triggered the dangerous plugin infobar.
1192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_EQ(1u, infobar_service->infobar_count());
1193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(infobar_service->infobar_at(0)->AsConfirmInfoBarDelegate());
1194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // And the plugin isn't running.
1195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(0, CountPlugins());
1196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Now set a policy to always authorize this.
1198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kAlwaysAuthorizePlugins, POLICY_LEVEL_MANDATORY,
1200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
1201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Reloading the page shouldn't trigger the infobar this time.
1203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(0u, infobar_service->infobar_count());
1205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // And the plugin started automatically.
1206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(1, CountPlugins());
1207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, DeveloperToolsDisabled) {
1210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that access to the developer tools can be disabled.
1211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Open devtools.
1213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_DEV_TOOLS));
1214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WebContents* contents =
1215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
1216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(DevToolsWindow::GetDockedInstanceForInspectedTab(contents));
1217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Disable devtools via policy.
1219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDeveloperToolsDisabled, POLICY_LEVEL_MANDATORY,
1221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
1222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The existing devtools window should have closed.
1224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(DevToolsWindow::GetDockedInstanceForInspectedTab(contents));
1225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // And it's not possible to open it again.
1226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(chrome::ExecuteCommand(browser(), IDC_DEV_TOOLS));
1227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(DevToolsWindow::GetDockedInstanceForInspectedTab(contents));
1228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, WebStoreIconHidden) {
1231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
1232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
1233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
1234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return;
1235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that the web store icons can be hidden from the new tab page.
1238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Open new tab page and look for the web store icons.
1240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
1241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WebContents* contents =
1242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    browser()->tab_strip_model()->GetActiveWebContents();
1243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#if !defined(OS_CHROMEOS)
1245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Look for web store's app ID in the apps page.
1246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(ContainsVisibleElement(contents,
1247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                     "ahfgeienlihckogmohjhadlkjgocpleb"));
1248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The next NTP has no footer.
1251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (ContainsVisibleElement(contents, "footer"))
1252257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EXPECT_TRUE(ContainsVisibleElement(contents, "chrome-web-store-link"));
1253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Turn off the web store icons.
1255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kHideWebStoreIcon, POLICY_LEVEL_MANDATORY,
1257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
1258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1260257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // The web store icons should now be hidden.
1261257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
1262257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(ContainsVisibleElement(contents,
1263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                      "ahfgeienlihckogmohjhadlkjgocpleb"));
1264257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(ContainsVisibleElement(contents, "chrome-web-store-link"));
1265257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1267257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// This policy isn't available on Chrome OS.
1268257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#if !defined(OS_CHROMEOS)
1269257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, DownloadDirectory) {
1270257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verifies that the download directory can be forced by policy.
1271257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1272257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Set the initial download directory.
1273257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  base::ScopedTempDir initial_dir;
1274257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT_TRUE(initial_dir.CreateUniqueTempDir());
1275257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  browser()->profile()->GetPrefs()->SetFilePath(
1276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      prefs::kDownloadDefaultDirectory, initial_dir.path());
1277257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Don't prompt for the download location during this test.
1278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  browser()->profile()->GetPrefs()->SetBoolean(
1279257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      prefs::kPromptForDownload, false);
1280257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that downloads end up on the default directory.
1282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
1283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  DownloadAndVerifyFile(browser(), initial_dir.path(), file);
1284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  file_util::DieFileDie(initial_dir.path().Append(file), false);
1285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Override the download directory with the policy and verify a download.
1287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ScopedTempDir forced_dir;
1288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(forced_dir.CreateUniqueTempDir());
1289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDownloadDirectory, POLICY_LEVEL_MANDATORY,
1291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER,
1292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateStringValue(forced_dir.path().value()), NULL);
1293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  DownloadAndVerifyFile(browser(), forced_dir.path(), file);
1295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that the first download location wasn't affected.
1296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(base::PathExists(initial_dir.path().Append(file)));
1297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklistSelective) {
1301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that blacklisted extensions can't be installed.
1302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ExtensionService* service = extension_service();
1303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
1304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_FALSE(service->GetExtensionById(kAdBlockCrxId, true));
1305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue blacklist;
1306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  blacklist.Append(base::Value::CreateStringValue(kGoodCrxId));
1307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY,
1309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, blacklist.DeepCopy(), NULL);
1310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // "good.crx" is blacklisted.
13138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  EXPECT_FALSE(InstallExtension(kGoodCrxName));
1314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(service->GetExtensionById(kGoodCrxId, true));
1315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // "adblock.crx" is not.
1317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const extensions::Extension* adblock = InstallExtension(kAdBlockCrxName);
1318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(adblock);
1319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(kAdBlockCrxId, adblock->id());
1320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(adblock,
1321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            service->GetExtensionById(kAdBlockCrxId, true));
1322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklistWildcard) {
1325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that a wildcard blacklist takes effect.
1326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(InstallExtension(kAdBlockCrxName));
1327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ExtensionService* service = extension_service();
1328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
1329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(service->GetExtensionById(kAdBlockCrxId, true));
1330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue blacklist;
1331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  blacklist.Append(base::Value::CreateStringValue("*"));
1332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY,
1334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, blacklist.DeepCopy(), NULL);
1335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // AdBlock was automatically removed.
1338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_FALSE(service->GetExtensionById(kAdBlockCrxId, true));
1339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // And can't be installed again, nor can good.crx.
1341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(InstallExtension(kAdBlockCrxName));
1342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(service->GetExtensionById(kAdBlockCrxId, true));
1343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(InstallExtension(kGoodCrxName));
1344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(service->GetExtensionById(kGoodCrxId, true));
1345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallWhitelist) {
1348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that the whitelist can open exceptions to the blacklist.
1349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ExtensionService* service = extension_service();
1350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
1351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_FALSE(service->GetExtensionById(kAdBlockCrxId, true));
1352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue blacklist;
1353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  blacklist.Append(base::Value::CreateStringValue("*"));
1354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue whitelist;
1355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  whitelist.Append(base::Value::CreateStringValue(kGoodCrxId));
1356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kExtensionInstallBlacklist, POLICY_LEVEL_MANDATORY,
1358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, blacklist.DeepCopy(), NULL);
1359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kExtensionInstallWhitelist, POLICY_LEVEL_MANDATORY,
1360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, whitelist.DeepCopy(), NULL);
1361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // "adblock.crx" is blacklisted.
1363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(InstallExtension(kAdBlockCrxName));
1364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(service->GetExtensionById(kAdBlockCrxId, true));
1365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // "good.crx" has a whitelist exception.
1366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const extensions::Extension* good = InstallExtension(kGoodCrxName);
1367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(good);
1368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(kGoodCrxId, good->id());
1369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(good, service->GetExtensionById(kGoodCrxId, true));
1370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The user can also remove this extension.
1371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UninstallExtension(kGoodCrxId, true);
1372257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallForcelist) {
1375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that extensions that are force-installed by policies are
1376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // installed and can't be uninstalled.
1377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ExtensionService* service = extension_service();
1378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
1379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Extensions that are force-installed come from an update URL, which defaults
1381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // to the webstore. Use a mock URL for this test with an update manifest
1382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // that includes "good_v1.crx".
1383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::FilePath path =
1384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      base::FilePath(kTestExtensionsDir).Append(kGoodV1CrxManifestName);
1385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  GURL url(URLRequestMockHTTPJob::GetMockUrl(path));
1386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Setting the forcelist extension should install "good_v1.crx".
1388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue forcelist;
1389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  forcelist.Append(base::Value::CreateStringValue(base::StringPrintf(
1390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "%s;%s", kGoodCrxId, url.spec().c_str())));
1391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kExtensionInstallForcelist, POLICY_LEVEL_MANDATORY,
1393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, forcelist.DeepCopy(), NULL);
1394257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::WindowedNotificationObserver observer(
1395257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      chrome::NOTIFICATION_EXTENSION_INSTALLED,
1396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      content::NotificationService::AllSources());
1397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  observer.Wait();
1399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Note: Cannot check that the notification details match the expected
1400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // exception, since the details object has already been freed prior to
1401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the completion of observer.Wait().
1402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(service->GetExtensionById(kGoodCrxId, true));
1404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The user is not allowed to uninstall force-installed extensions.
1406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UninstallExtension(kGoodCrxId, false);
1407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The user is not allowed to load an unpacked extension with the
1409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // same ID as a force-installed extension.
1410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  LoadUnpackedExtension(kGoodUnpackedExt, false);
1411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Loading other unpacked extensions are not blocked.
1413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  LoadUnpackedExtension(kAppUnpackedExt, true);
1414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const std::string old_version_number =
1416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      service->GetExtensionById(kGoodCrxId, true)->version()->GetString();
1417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::FilePath test_path;
1419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_path));
1420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TestRequestInterceptor interceptor("update.extension");
1422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  interceptor.PushJobCallback(
1423257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      TestRequestInterceptor::FileJob(
1424257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          test_path.Append(kTestExtensionsDir).Append(kGood2CrxManifestName)));
1425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // Updating the force-installed extension.
1427257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  extensions::ExtensionUpdater* updater = service->updater();
14281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  extensions::ExtensionUpdater::CheckParams params;
1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  params.install_immediately = true;
1430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WindowedNotificationObserver update_observer(
1431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      chrome::NOTIFICATION_EXTENSION_INSTALLED,
1432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      content::NotificationService::AllSources());
1433257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  updater->CheckNow(params);
1434257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  update_observer.Wait();
1435257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const base::Version* new_version =
1437257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      service->GetExtensionById(kGoodCrxId, true)->version();
1438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT_TRUE(new_version->IsValid());
1439257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  base::Version old_version(old_version_number);
1440257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT_TRUE(old_version.IsValid());
1441257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(1, new_version->CompareTo(old_version));
1443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ(0u, interceptor.GetPendingSize());
144569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
1446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
144769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionAllowedTypes) {
1448257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verifies that extensions are blocked if policy specifies an allowed types
1449257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // list and the extension's type is not on that list.
145069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ExtensionService* service = extension_service();
1451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
145269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ASSERT_FALSE(service->GetExtensionById(kHostedAppCrxId, true));
1453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  base::ListValue allowed_types;
1455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  allowed_types.AppendString("hosted_app");
1456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PolicyMap policies;
1457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  policies.Set(key::kExtensionAllowedTypes, POLICY_LEVEL_MANDATORY,
1458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_SCOPE_USER, allowed_types.DeepCopy(), NULL);
1459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UpdateProviderPolicy(policies);
1460257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1461257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // "good.crx" is blocked.
1462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(InstallExtension(kGoodCrxName));
1463257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(service->GetExtensionById(kGoodCrxId, true));
1464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // "hosted_app.crx" is of a whitelisted type.
1466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const extensions::Extension* hosted_app = InstallExtension(kHostedAppCrxName);
1467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(hosted_app);
1468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(kHostedAppCrxId, hosted_app->id());
1469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(hosted_app, service->GetExtensionById(kHostedAppCrxId, true));
1470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The user can remove the extension.
1472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UninstallExtension(kHostedAppCrxId, true);
1473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Checks that a click on an extension CRX download triggers the extension
1476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// installation prompt without further user interaction when the source is
1477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// whitelisted by policy.
1478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallSources) {
1479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
1480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      switches::kAppsGalleryInstallAutoConfirmForTests, "accept");
1481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const GURL install_source_url(URLRequestMockHTTPJob::GetMockUrl(
1483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("extensions/*"))));
1484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const GURL referrer_url(URLRequestMockHTTPJob::GetMockUrl(
1485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("policy/*"))));
1486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1487257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const GURL download_page_url(URLRequestMockHTTPJob::GetMockUrl(base::FilePath(
1488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      FILE_PATH_LITERAL("policy/extension_install_sources_test.html"))));
1489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), download_page_url);
1490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // As long as the policy is not present, extensions are considered dangerous.
1492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::DownloadTestObserverTerminal download_observer(
1493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      content::BrowserContext::GetDownloadManager(browser()->profile()), 1,
1494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_DENY);
1495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PerformClick(0, 0);
1496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  download_observer.WaitForFinished();
1497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Install the policy and trigger another download.
1499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue install_sources;
1500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  install_sources.AppendString(install_source_url.spec());
1501b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  install_sources.AppendString(referrer_url.spec());
1502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kExtensionInstallSources, POLICY_LEVEL_MANDATORY,
1504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, install_sources.DeepCopy(), NULL);
1505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WindowedNotificationObserver observer(
1508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      chrome::NOTIFICATION_EXTENSION_INSTALLED,
1509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      content::NotificationService::AllSources());
1510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PerformClick(1, 0);
1511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  observer.Wait();
1512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Note: Cannot check that the notification details match the expected
1513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // exception, since the details object has already been freed prior to
1514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the completion of observer.Wait().
1515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The first extension shouldn't be present, the second should be there.
1517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(extension_service()->GetExtensionById(kGoodCrxId, true));
1518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(extension_service()->GetExtensionById(kAdBlockCrxId, false));
1519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, HomepageLocation) {
1522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
1523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
1524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
1525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return;
1526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that the homepage can be configured with policies.
1529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Set a default, and check that the home button navigates there.
1530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  browser()->profile()->GetPrefs()->SetString(
1531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      prefs::kHomePage, chrome::kChromeUIPolicyURL);
1532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  browser()->profile()->GetPrefs()->SetBoolean(
1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      prefs::kHomePageIsNewTabPage, false);
1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(GURL(chrome::kChromeUIPolicyURL),
1535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            browser()->profile()->GetHomePage());
1536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WebContents* contents =
1537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
1538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(GURL(content::kAboutBlankURL), contents->GetURL());
1539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_HOME));
1540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(GURL(chrome::kChromeUIPolicyURL), contents->GetURL());
1541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Now override with policy.
1543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kHomepageLocation, POLICY_LEVEL_MANDATORY,
1545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER,
1546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateStringValue(chrome::kChromeUICreditsURL),
1547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               NULL);
1548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_HOME));
1550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WaitForLoadStop(contents);
1551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(GURL(chrome::kChromeUICreditsURL), contents->GetURL());
1552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kHomepageIsNewTabPage, POLICY_LEVEL_MANDATORY,
1554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
1555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_HOME));
1557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WaitForLoadStop(contents);
1558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), contents->GetURL());
1559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, IncognitoEnabled) {
1562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that incognito windows can't be opened when disabled by policy.
1563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const BrowserList* active_browser_list =
1565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      BrowserList::GetInstance(chrome::GetActiveDesktop());
156669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Disable incognito via policy and verify that incognito windows can't be
1568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // opened.
1569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(1u, active_browser_list->size());
1570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(BrowserList::IsOffTheRecordSessionActive());
1571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kIncognitoEnabled, POLICY_LEVEL_MANDATORY,
1573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL);
1574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(chrome::ExecuteCommand(browser(), IDC_NEW_INCOGNITO_WINDOW));
1576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(1u, active_browser_list->size());
1577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(BrowserList::IsOffTheRecordSessionActive());
1578257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Enable via policy and verify that incognito windows can be opened.
1580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kIncognitoEnabled, POLICY_LEVEL_MANDATORY,
1581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
1582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_NEW_INCOGNITO_WINDOW));
1584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(2u, active_browser_list->size());
1585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(BrowserList::IsOffTheRecordSessionActive());
15863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
1587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, Javascript) {
1589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that Javascript can be disabled.
1590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WebContents* contents =
1591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
1592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(IsJavascriptEnabled(contents));
1593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_DEV_TOOLS));
1594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_DEV_TOOLS_CONSOLE));
15958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Disable Javascript via policy.
1597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kJavascriptEnabled, POLICY_LEVEL_MANDATORY,
1599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL);
1600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Reload the page.
1602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
1603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(IsJavascriptEnabled(contents));
1604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Developer tools still work when javascript is disabled.
1605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_DEV_TOOLS));
1606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_DEV_TOOLS_CONSOLE));
1607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Javascript is always enabled for the internal pages.
1608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL));
1609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(IsJavascriptEnabled(contents));
1610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The javascript content setting policy overrides the javascript policy.
1612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
1613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(IsJavascriptEnabled(contents));
1614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDefaultJavaScriptSetting, POLICY_LEVEL_MANDATORY,
1615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER,
1616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateIntegerValue(CONTENT_SETTING_ALLOW), NULL);
1617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
1619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(IsJavascriptEnabled(contents));
1620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, SavingBrowserHistoryDisabled) {
1623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that browsing history is not saved.
1624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kSavingBrowserHistoryDisabled, POLICY_LEVEL_MANDATORY,
1626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
1627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  GURL url = ui_test_utils::GetTestUrl(
1629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      base::FilePath(base::FilePath::kCurrentDirectory),
1630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("empty.html")));
1631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that the navigation wasn't saved in the history.
1633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::HistoryEnumerator enumerator1(browser()->profile());
1634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(0u, enumerator1.urls().size());
1635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Now flip the policy and try again.
1637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kSavingBrowserHistoryDisabled, POLICY_LEVEL_MANDATORY,
1638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL);
1639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that the navigation was saved in the history.
1642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::HistoryEnumerator enumerator2(browser()->profile());
1643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_EQ(1u, enumerator2.urls().size());
1644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(url, enumerator2.urls()[0]);
1645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1647b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// http://crbug.com/241691 PolicyTest.TranslateEnabled is failing regularly.
1648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, DISABLED_TranslateEnabled) {
1649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that translate can be forced enabled or disabled by policy.
1650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Get the InfoBarService, and verify that there are no infobars on startup.
1652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WebContents* contents =
1653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
1654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(contents);
1655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InfoBarService* infobar_service = InfoBarService::FromWebContents(contents);
1656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_TRUE(infobar_service);
1657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(0u, infobar_service->infobar_count());
1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Force enable the translate feature.
1660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kTranslateEnabled, POLICY_LEVEL_MANDATORY,
1662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
1663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1664257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Instead of waiting for NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED, this test
166544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // waits for NOTIFICATION_TAB_LANGUAGE_DETERMINED because that's what the
166644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // TranslateManager observes. This allows checking that an infobar is NOT
166744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // shown below, without polling for infobars for some indeterminate amount
166844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // of time.
166944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  GURL url = ui_test_utils::GetTestUrl(
167044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      base::FilePath(),
1671257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("translate/fr_test.html")));
1672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::WindowedNotificationObserver language_observer1(
167344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
1674257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      content::NotificationService::AllSources());
1675257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  language_observer1.Wait();
167744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
167844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Verify the translation detected for this tab.
167944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  TranslateTabHelper* translate_tab_helper =
1680257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      TranslateTabHelper::FromWebContents(contents);
168144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT_TRUE(translate_tab_helper);
1682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LanguageState& language_state = translate_tab_helper->language_state();
168344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EXPECT_EQ("fr", language_state.original_language());
1684257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_TRUE(language_state.page_needs_translation());
1685257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_FALSE(language_state.translation_pending());
168644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EXPECT_FALSE(language_state.translation_declined());
168744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EXPECT_FALSE(language_state.IsPageTranslated());
168844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1689257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verify that the translate infobar showed up.
169044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT_EQ(1u, infobar_service->infobar_count());
169144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  InfoBarDelegate* infobar = infobar_service->infobar_at(0);
169244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  TranslateInfoBarDelegate* translate_infobar_delegate =
169344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      infobar->AsTranslateInfoBarDelegate();
169444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT_TRUE(translate_infobar_delegate);
169544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE,
169644f0eee88ff00398ff7f715fab053374d808c90dSteve Block            translate_infobar_delegate->infobar_type());
1697257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EXPECT_EQ("fr", translate_infobar_delegate->original_language_code());
1698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Now force disable translate.
1700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  infobar_service->RemoveInfoBar(infobar);
1701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(0u, infobar_service->infobar_count());
1702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kTranslateEnabled, POLICY_LEVEL_MANDATORY,
1703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL);
1704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Navigating to the same URL now doesn't trigger an infobar.
1706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WindowedNotificationObserver language_observer2(
17078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
1708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      content::NotificationService::AllSources());
1709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  language_observer2.Wait();
1711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(0u, infobar_service->infobar_count());
1712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, URLBlacklist) {
1715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Checks that URLs can be blacklisted, and that exceptions can be made to
1716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the blacklist.
1717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Filter |kURLS| on IO thread, so that requests to those hosts end up
1719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // as URLRequestMockHTTPJobs.
1720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* kURLS[] = {
1721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    "http://aaa.com/empty.html",
1722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    "http://bbb.com/empty.html",
1723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    "http://sub.bbb.com/empty.html",
1724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    "http://bbb.com/policy/blank.html",
1725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
1726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  {
1727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    base::RunLoop loop;
1728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    BrowserThread::PostTaskAndReply(
1729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        BrowserThread::IO, FROM_HERE,
1730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Bind(RedirectHostsToTestData, kURLS, arraysize(kURLS)),
1731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        loop.QuitClosure());
1732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    loop.Run();
1733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that "bbb.com" opens before applying the blacklist.
1736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckCanOpenURL(browser(), kURLS[1]);
1737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Set a blacklist.
1739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue blacklist;
1740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  blacklist.Append(base::Value::CreateStringValue("bbb.com"));
1741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kURLBlacklist, POLICY_LEVEL_MANDATORY,
1743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, blacklist.DeepCopy(), NULL);
1744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FlushBlacklistPolicy();
1746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // All bbb.com URLs are blocked, and "aaa.com" is still unblocked.
1747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckCanOpenURL(browser(), kURLS[0]);
1748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (size_t i = 1; i < arraysize(kURLS); ++i)
1749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    CheckURLIsBlocked(browser(), kURLS[i]);
1750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Whitelist some sites of bbb.com.
1752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue whitelist;
1753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  whitelist.Append(base::Value::CreateStringValue("sub.bbb.com"));
1754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  whitelist.Append(base::Value::CreateStringValue("bbb.com/policy"));
1755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kURLWhitelist, POLICY_LEVEL_MANDATORY,
1756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, whitelist.DeepCopy(), NULL);
1757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FlushBlacklistPolicy();
1759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckURLIsBlocked(browser(), kURLS[1]);
1760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckCanOpenURL(browser(), kURLS[2]);
1761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckCanOpenURL(browser(), kURLS[3]);
1762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  {
1764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    base::RunLoop loop;
1765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    BrowserThread::PostTaskAndReply(
1766b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        BrowserThread::IO, FROM_HERE,
1767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Bind(UndoRedirectHostsToTestData, kURLS, arraysize(kURLS)),
1768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        loop.QuitClosure());
1769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    loop.Run();
1770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, FileURLBlacklist) {
1774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Check that FileURLs can be blacklisted and DisabledSchemes works together
1775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // with URLblacklisting and URLwhitelisting.
1776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::FilePath test_path;
1778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PathService::Get(chrome::DIR_TEST_DATA, &test_path);
1779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const std::string base_path = "file://" + test_path.AsUTF8Unsafe() +"/";
178069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  const std::string folder_path = base_path + "apptest/";
1781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const std::string file_path1 = base_path + "title1.html";
1782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const std::string file_path2 = folder_path + "basic.html";
1783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckCanOpenURL(browser(), file_path1.c_str());
1785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckCanOpenURL(browser(), file_path2.c_str());
1786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Set a blacklist for all the files.
1788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue blacklist;
1789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  blacklist.Append(base::Value::CreateStringValue("file://*"));
1790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kURLBlacklist, POLICY_LEVEL_MANDATORY,
1792257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch               POLICY_SCOPE_USER, blacklist.DeepCopy(), NULL);
1793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FlushBlacklistPolicy();
1795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckURLIsBlocked(browser(), file_path1.c_str());
1797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckURLIsBlocked(browser(), file_path2.c_str());
1798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Replace the URLblacklist with disabling the file scheme.
18003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  blacklist.Remove(base::StringValue("file://*"), NULL);
1801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kURLBlacklist, POLICY_LEVEL_MANDATORY,
1802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, blacklist.DeepCopy(), NULL);
1803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FlushBlacklistPolicy();
1805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PrefService* prefs = browser()->profile()->GetPrefs();
1807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const base::ListValue* list_url = prefs->GetList(prefs::kUrlBlacklist);
1808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(list_url->Find(base::StringValue("file://*")),
18098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch            list_url->end());
1810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue disabledscheme;
1812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  disabledscheme.Append(base::Value::CreateStringValue("file"));
1813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kDisabledSchemes, POLICY_LEVEL_MANDATORY,
1814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, disabledscheme.DeepCopy(), NULL);
1815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FlushBlacklistPolicy();
1817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  list_url = prefs->GetList(prefs::kUrlBlacklist);
1819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_NE(list_url->Find(base::StringValue("file://*")),
1820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            list_url->end());
1821b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Whitelist one folder and blacklist an another just inside.
1823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::ListValue whitelist;
1824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  whitelist.Append(base::Value::CreateStringValue(base_path));
1825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kURLWhitelist, POLICY_LEVEL_MANDATORY,
1826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, whitelist.DeepCopy(), NULL);
1827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  blacklist.Append(base::Value::CreateStringValue(folder_path));
1828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kURLBlacklist, POLICY_LEVEL_MANDATORY,
1829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, blacklist.DeepCopy(), NULL);
1830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FlushBlacklistPolicy();
1832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckCanOpenURL(browser(), file_path1.c_str());
1834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CheckURLIsBlocked(browser(), file_path2.c_str());
1835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Flaky on Linux. http://crbug.com/155459
1838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#if defined(OS_LINUX)
1839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define MAYBE_DisableScreenshotsFeedback DISABLED_DisableScreenshotsFeedback
1840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#else
1841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define MAYBE_DisableScreenshotsFeedback DisableScreenshotsFeedback
1842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, MAYBE_DisableScreenshotsFeedback) {
1844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
1845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
1846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
1847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return;
1848b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1849b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Make sure current screenshot can be taken and displayed on feedback page.
1851b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TestScreenshotFeedback(true);
1852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Check if banning screenshots disabled feedback page's ability to grab a
1854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // screenshot.
1855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TestScreenshotFeedback(false);
1856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#if defined(OS_CHROMEOS)
1859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, DisableScreenshotsFile) {
1860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int screenshot_count = CountScreenshots();
1861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Make sure screenshots are counted correctly.
1863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TestScreenshotFile(true);
1864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_EQ(CountScreenshots(), screenshot_count + 1);
1865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Check if trying to take a screenshot fails when disabled by policy.
1867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TestScreenshotFile(false);
1868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT_EQ(CountScreenshots(), screenshot_count + 1);
1869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, DisableAudioOutput) {
1872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Set up the mock observer.
1873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  chromeos::CrasAudioHandler* audio_handler = chromeos::CrasAudioHandler::Get();
1874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  scoped_ptr<TestAudioObserver> test_observer(new TestAudioObserver);
1875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  audio_handler->AddAudioObserver(test_observer.get());
1876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1877257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool prior_state = audio_handler->IsOutputMuted();
1878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Make sure the audio is not muted and then toggle the policy and observe
1879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // if the output mute changed event is fired.
188044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  audio_handler->SetOutputMute(false);
188144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EXPECT_FALSE(audio_handler->IsOutputMuted());
1882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(1, test_observer->output_mute_changed_count());
1883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kAudioOutputAllowed, POLICY_LEVEL_MANDATORY,
1885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL);
1886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(audio_handler->IsOutputMuted());
1888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // This should not change the state now and should not trigger output mute
1889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // changed event.
1890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  audio_handler->SetOutputMute(false);
1891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(audio_handler->IsOutputMuted());
1892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(1, test_observer->output_mute_changed_count());
1893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Toggle back and observe if the output mute changed event is fired.
1895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kAudioOutputAllowed, POLICY_LEVEL_MANDATORY,
1896b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
1897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1898b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(audio_handler->IsOutputMuted());
1899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(1, test_observer->output_mute_changed_count());
1900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  audio_handler->SetOutputMute(true);
1901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(audio_handler->IsOutputMuted());
1902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(2, test_observer->output_mute_changed_count());
1903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Revert the prior state.
1904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  audio_handler->SetOutputMute(prior_state);
1905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  audio_handler->RemoveAudioObserver(test_observer.get());
1906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, PRE_SessionLengthLimit) {
1909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Set the session start time to 2 hours ago.
1910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  g_browser_process->local_state()->SetInt64(
19118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      prefs::kSessionStartTime,
1912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      (base::TimeTicks::Now() - base::TimeDelta::FromHours(2))
1913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch          .ToInternalValue());
1914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, SessionLengthLimit) {
1917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::MockNotificationObserver observer;
1918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::NotificationRegistrar registrar;
1919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  registrar.Add(&observer,
1920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                chrome::NOTIFICATION_APP_TERMINATING,
1921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                content::NotificationService::AllSources());
1922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Set the session length limit to 3 hours. Verify that the session is not
1924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // terminated.
1925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_CALL(observer, Observe(chrome::NOTIFICATION_APP_TERMINATING, _, _))
1926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      .Times(0);
1927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kSessionLengthLimit, POLICY_LEVEL_MANDATORY,
1929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER,
1930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateIntegerValue(180 * 60 * 1000),  // 3 hours.
1931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               NULL);
1932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::RunLoop().RunUntilIdle();
1934b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Mock::VerifyAndClearExpectations(&observer);
1935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Decrease the session length limit to 1 hour. Verify that the session is
1937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // terminated immediately.
1938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_CALL(observer, Observe(chrome::NOTIFICATION_APP_TERMINATING, _, _));
1939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kSessionLengthLimit, POLICY_LEVEL_MANDATORY,
1940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER,
1941b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateIntegerValue(60 * 60 * 1000),  // 1 hour.
1942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               NULL);
1943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  base::RunLoop().RunUntilIdle();
1945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Mock::VerifyAndClearExpectations(&observer);
1946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, LargeCursorEnabled) {
1949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that the large cursor accessibility feature can be controlled
1950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // through policy.
1951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  chromeos::AccessibilityManager* accessibility_manager =
1952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      chromeos::AccessibilityManager::Get();
1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Manually enable the large cursor.
1955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  accessibility_manager->EnableLargeCursor(true);
1956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(accessibility_manager->IsLargeCursorEnabled());
1957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that policy overrides the manual setting.
1959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kLargeCursorEnabled, POLICY_LEVEL_MANDATORY,
1961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER,
1962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateBooleanValue(false), NULL);
1963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(accessibility_manager->IsLargeCursorEnabled());
1965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that the large cursor cannot be enabled manually anymore.
1967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  accessibility_manager->EnableLargeCursor(true);
1968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(accessibility_manager->IsLargeCursorEnabled());
1969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, SpokenFeedbackEnabled) {
1972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that the spoken feedback accessibility feature can be controlled
1973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // through policy.
1974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  chromeos::AccessibilityManager* accessibility_manager =
1975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      chromeos::AccessibilityManager::Get();
1976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Manually enable spoken feedback.
1978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  accessibility_manager->EnableSpokenFeedback(
197969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      true, ash::A11Y_NOTIFICATION_NONE);
1980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(accessibility_manager->IsSpokenFeedbackEnabled());
1981b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that policy overrides the manual setting.
1983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
1984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kSpokenFeedbackEnabled, POLICY_LEVEL_MANDATORY,
1985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER,
1986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateBooleanValue(false), NULL);
1987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
1988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(accessibility_manager->IsSpokenFeedbackEnabled());
1989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that spoken feedback cannot be enabled manually anymore.
1991257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  accessibility_manager->EnableSpokenFeedback(
1992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      true, ash::A11Y_NOTIFICATION_NONE);
1993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(accessibility_manager->IsSpokenFeedbackEnabled());
1994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, HighContrastEnabled) {
1997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that the high contrast mode accessibility feature can be
1998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // controlled through policy.
19993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  chromeos::AccessibilityManager* accessibility_manager =
2000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      chromeos::AccessibilityManager::Get();
2001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Manually enable high contrast mode.
2003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  accessibility_manager->EnableHighContrast(true);
2004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(accessibility_manager->IsHighContrastEnabled());
2005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that policy overrides the manual setting.
2007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
20088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  policies.Set(key::kHighContrastEnabled, POLICY_LEVEL_MANDATORY,
2009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER,
2010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateBooleanValue(false), NULL);
2011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
2012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(accessibility_manager->IsHighContrastEnabled());
2013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that high contrast mode cannot be enabled manually anymore.
2015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  accessibility_manager->EnableHighContrast(true);
2016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(accessibility_manager->IsHighContrastEnabled());
2017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, ScreenMagnifierTypeNone) {
2020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that the screen magnifier can be disabled through policy.
2021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  chromeos::MagnificationManager* magnification_manager =
2022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      chromeos::MagnificationManager::Get();
2023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Manually enable the full-screen magnifier.
2025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  magnification_manager->SetMagnifierType(ash::MAGNIFIER_FULL);
2026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  magnification_manager->SetMagnifierEnabled(true);
2027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(ash::MAGNIFIER_FULL, magnification_manager->GetMagnifierType());
2028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(magnification_manager->IsMagnifierEnabled());
20291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that policy overrides the manual setting.
2031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
2032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kScreenMagnifierType, POLICY_LEVEL_MANDATORY,
2033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER,
2034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateIntegerValue(0), NULL);
2035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
2036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(magnification_manager->IsMagnifierEnabled());
2037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that the screen magnifier cannot be enabled manually anymore.
2039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  magnification_manager->SetMagnifierEnabled(true);
2040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(magnification_manager->IsMagnifierEnabled());
2041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyTest, ScreenMagnifierTypeFull) {
2044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verifies that the full-screen magnifier can be enabled through policy.
2045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  chromeos::MagnificationManager* magnification_manager =
2046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      chromeos::MagnificationManager::Get();
2047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that the screen magnifier is initially disabled.
2049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_FALSE(magnification_manager->IsMagnifierEnabled());
2050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that policy can enable the full-screen magnifier.
2052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PolicyMap policies;
2053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  policies.Set(key::kScreenMagnifierType, POLICY_LEVEL_MANDATORY,
2054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               POLICY_SCOPE_USER,
2055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               base::Value::CreateIntegerValue(ash::MAGNIFIER_FULL), NULL);
2056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UpdateProviderPolicy(policies);
2057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_EQ(ash::MAGNIFIER_FULL, magnification_manager->GetMagnifierType());
2058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(magnification_manager->IsMagnifierEnabled());
2059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that the screen magnifier cannot be disabled manually anymore.
2061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  magnification_manager->SetMagnifierEnabled(false);
2062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_TRUE(magnification_manager->IsMagnifierEnabled());
2063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace {
2068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic const char* kRestoredURLs[] = {
2070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  "http://aaa.com/empty.html",
2071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  "http://bbb.com/empty.html",
2072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2073257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2074e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochbool IsNonSwitchArgument(const CommandLine::StringType& s) {
2075257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return s.empty() || s[0] != '-';
20761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
20771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}  // namespace
20791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Similar to PolicyTest but allows setting policies before the browser is
20811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// created. Each test parameter is a method that sets up the early policies
20823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// and stores the expected startup URLs in |expected_urls_|.
20831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass RestoreOnStartupPolicyTest
2084257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    : public PolicyTest,
20851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      public testing::WithParamInterface<
20861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block          void (RestoreOnStartupPolicyTest::*)(void)> {
20871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
20881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  RestoreOnStartupPolicyTest() {}
20891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual ~RestoreOnStartupPolicyTest() {}
20901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#if defined(OS_CHROMEOS)
20923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
20931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // TODO(nkostylev): Investigate if we can remove this switch.
2094257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    command_line->AppendSwitch(switches::kCreateBrowserOnStartupForTests);
20951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    PolicyTest::SetUpCommandLine(command_line);
20961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
20971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif
20981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
21001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    PolicyTest::SetUpInProcessBrowserTestFixture();
21011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // Set early policies now, before the browser is created.
21021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    (this->*(GetParam()))();
21031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
21041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // Remove the non-switch arguments, so that session restore kicks in for
2105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // these tests.
2106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    CommandLine* command_line = CommandLine::ForCurrentProcess();
2107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    CommandLine::StringVector argv = command_line->argv();
2108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    argv.erase(std::remove_if(++argv.begin(), argv.end(), IsNonSwitchArgument),
2109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               argv.end());
2110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    command_line->InitFromArgv(argv);
2111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT_TRUE(std::equal(argv.begin(), argv.end(),
2112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                           command_line->argv().begin()));
2113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
21143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // Redirect the test URLs to the test data directory.
2115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    RedirectHostsToTestData(kRestoredURLs, arraysize(kRestoredURLs));
2116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void HomepageIsNotNTP() {
2119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Verifies that policy can set the startup pages to the homepage, when
2120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // the homepage is not the NTP.
2121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    PolicyMap policies;
2122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    policies.Set(
2123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        key::kRestoreOnStartup, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Value::CreateIntegerValue(
2125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            SessionStartupPref::kPrefValueHomePage),
2126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        NULL);
2127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    policies.Set(
2128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        key::kHomepageIsNewTabPage, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
21293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        base::Value::CreateBooleanValue(false), NULL);
2130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    policies.Set(
2131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        key::kHomepageLocation, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Value::CreateStringValue(kRestoredURLs[1]), NULL);
2133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    provider_.UpdateChromePolicy(policies);
2134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    expected_urls_.push_back(GURL(kRestoredURLs[1]));
2136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void HomepageIsNTP() {
2139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Verifies that policy can set the startup pages to the homepage, when
2140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // the homepage is the NTP.
2141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    PolicyMap policies;
2142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    policies.Set(
2143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        key::kRestoreOnStartup, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Value::CreateIntegerValue(
2145257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch            SessionStartupPref::kPrefValueHomePage),
214680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        NULL);
2147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    policies.Set(
2148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        key::kHomepageIsNewTabPage, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
214980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::Value::CreateBooleanValue(true), NULL);
215080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    provider_.UpdateChromePolicy(policies);
215180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
215280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    expected_urls_.push_back(GURL(chrome::kChromeUINewTabURL));
215380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
2154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void ListOfURLs() {
2156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Verifies that policy can set the startup pages to a list of URLs.
2157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    base::ListValue urls;
2158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    for (size_t i = 0; i < arraysize(kRestoredURLs); ++i) {
2159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      urls.Append(base::Value::CreateStringValue(kRestoredURLs[i]));
2160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      expected_urls_.push_back(GURL(kRestoredURLs[i]));
2161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    PolicyMap policies;
2163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    policies.Set(
2164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        key::kRestoreOnStartup, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Value::CreateIntegerValue(SessionStartupPref::kPrefValueURLs),
2166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        NULL);
216780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    policies.Set(
216880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        key::kRestoreOnStartupURLs, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        urls.DeepCopy(), NULL);
2170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    provider_.UpdateChromePolicy(policies);
2171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void NTP() {
2174257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // Verifies that policy can set the startup page to the NTP.
2175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    PolicyMap policies;
21763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    policies.Set(
2177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        key::kRestoreOnStartup, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Value::CreateIntegerValue(SessionStartupPref::kPrefValueNewTab),
2179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        NULL);
2180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    provider_.UpdateChromePolicy(policies);
2181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    expected_urls_.push_back(GURL(chrome::kChromeUINewTabURL));
2182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void Last() {
2185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Verifies that policy can set the startup pages to the last session.
2186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    PolicyMap policies;
2187257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    policies.Set(
2188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        key::kRestoreOnStartup, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Value::CreateIntegerValue(SessionStartupPref::kPrefValueLast),
2190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        NULL);
219144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    provider_.UpdateChromePolicy(policies);
219244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // This should restore the tabs opened at PRE_RunTest below.
2193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    for (size_t i = 0; i < arraysize(kRestoredURLs); ++i)
2194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      expected_urls_.push_back(GURL(kRestoredURLs[i]));
2195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  std::vector<GURL> expected_urls_;
2198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochIN_PROC_BROWSER_TEST_P(RestoreOnStartupPolicyTest, PRE_RunTest) {
2201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Open some tabs to verify if they are restored after the browser restarts.
22028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Most policy settings override this, except kPrefValueLast which enforces
2203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // a restore.
2204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), GURL(kRestoredURLs[0]));
2205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (size_t i = 1; i < arraysize(kRestoredURLs); ++i) {
2206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    content::WindowedNotificationObserver observer(
2207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        content::NOTIFICATION_LOAD_STOP,
2208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        content::NotificationService::AllSources());
2209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    chrome::AddSelectedTabWithURL(browser(), GURL(kRestoredURLs[i]),
2210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                  content::PAGE_TRANSITION_LINK);
221180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    observer.Wait();
2212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
221380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
221480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
221580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian MonsenIN_PROC_BROWSER_TEST_P(RestoreOnStartupPolicyTest, RunTest) {
221680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#if defined(OS_WIN) && defined(USE_ASH)
221780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
221880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
221980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    return;
222080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#endif
222180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
222280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  TabStripModel* model = browser()->tab_strip_model();
222380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  int size = static_cast<int>(expected_urls_.size());
222480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  EXPECT_EQ(size, model->count());
222544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  for (int i = 0; i < size && i < model->count(); ++i) {
222644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EXPECT_EQ(expected_urls_[i], model->GetWebContentsAt(i)->GetURL());
222744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
222880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
2229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
223080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian MonsenINSTANTIATE_TEST_CASE_P(
223180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    RestoreOnStartupPolicyTestInstance,
223280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    RestoreOnStartupPolicyTest,
223344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    testing::Values(&RestoreOnStartupPolicyTest::HomepageIsNotNTP,
223444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                    &RestoreOnStartupPolicyTest::HomepageIsNTP,
223544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                    &RestoreOnStartupPolicyTest::ListOfURLs,
223644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                    &RestoreOnStartupPolicyTest::NTP,
223744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                    &RestoreOnStartupPolicyTest::Last));
223844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
223980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// Similar to PolicyTest but sets a couple of policies before the browser is
224080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// started.
224180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenclass PolicyStatisticsCollectorTest : public PolicyTest {
224280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen public:
224380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  PolicyStatisticsCollectorTest() {}
224480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  virtual ~PolicyStatisticsCollectorTest() {}
224544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
224680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
224780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    PolicyTest::SetUpInProcessBrowserTestFixture();
224880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    PolicyMap policies;
224980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    policies.Set(
225080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        key::kShowHomeButton, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
225180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::Value::CreateBooleanValue(true), NULL);
225280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    policies.Set(
225380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        key::kBookmarkBarEnabled, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
225480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::Value::CreateBooleanValue(false), NULL);
225580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    policies.Set(
225680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        key::kHomepageLocation, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
225780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::Value::CreateStringValue("http://chromium.org"), NULL);
225880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    provider_.UpdateChromePolicy(policies);
225980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
226080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen};
2261257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
226280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian MonsenIN_PROC_BROWSER_TEST_F(PolicyStatisticsCollectorTest, Startup) {
2263257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Verifies that policy usage histograms are collected at startup.
226480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
2265257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // BrowserPolicyConnector::Init() has already been called. Make sure the
226680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  // CompleteInitialization() task has executed as well.
226780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  content::RunAllPendingInMessageLoop();
2268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  GURL kAboutHistograms = GURL(std::string(chrome::kAboutScheme) +
2270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                               std::string(content::kStandardSchemeSeparator) +
2271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                               std::string(content::kChromeUIHistogramHost));
2272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ui_test_utils::NavigateToURL(browser(), kAboutHistograms);
2273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  content::WebContents* contents =
2274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
227580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  std::string text;
227680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
227780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      contents,
227880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      "var nodes = document.querySelectorAll('body > pre');"
227980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      "var result = '';"
2280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "for (var i = 0; i < nodes.length; ++i) {"
2281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "  var text = nodes[i].innerHTML;"
2282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "  if (text.indexOf('Histogram: Enterprise.Policies') === 0) {"
2283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "    result = text;"
2284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "    break;"
2285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "  }"
2286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "}"
2287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      "domAutomationController.send(result);",
2288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      &text));
228980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  ASSERT_FALSE(text.empty());
229080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  const std::string kExpectedLabel =
229180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      "Histogram: Enterprise.Policies recorded 3 samples";
229280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  EXPECT_EQ(kExpectedLabel, text.substr(0, kExpectedLabel.size()));
229380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  // HomepageLocation has policy ID 1.
2294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_NE(std::string::npos, text.find("<br>1   ---"));
2295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // ShowHomeButton has policy ID 35.
2296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_NE(std::string::npos, text.find("<br>35  ---"));
2297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // BookmarkBarEnabled has policy ID 82.
2298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EXPECT_NE(std::string::npos, text.find("<br>82  ---"));
2299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass MediaStreamDevicesControllerBrowserTest
2302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    : public PolicyTest,
2303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      public testing::WithParamInterface<bool> {
2304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  MediaStreamDevicesControllerBrowserTest()
2306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : request_url_allowed_via_whitelist_(false) {
2307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    policy_value_ = GetParam();
2308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual ~MediaStreamDevicesControllerBrowserTest() {}
2310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Configure a given policy map.
2312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The |policy_name| is the name of either the audio or video capture allow
2313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // policy and must never be NULL.
2314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // |whitelist_policy| and |allow_rule| are optional.  If NULL, no whitelist
2315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // policy is set.  If non-NULL, the request_url_ will be set to be non empty
2316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // and the whitelist policy is set to contain either the |allow_rule| (if
2317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // non-NULL) or an "allow all" wildcard.
231880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  void ConfigurePolicyMap(PolicyMap* policies, const char* policy_name,
2319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                          const char* whitelist_policy,
2320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                          const char* allow_rule) {
2321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    policies->Set(policy_name, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Value::CreateBooleanValue(policy_value_), NULL);
2323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
232444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (whitelist_policy) {
232544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      // TODO(tommi): Remove the kiosk mode flag when the whitelist is visible
232644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      // in the media exceptions UI.
2327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      // See discussion here: https://codereview.chromium.org/15738004/
2328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      CommandLine::ForCurrentProcess()->AppendSwitch(switches::kKioskMode);
2329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      // Add an entry to the whitelist that allows the specified URL regardless
2331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      // of the setting of kAudioCapturedAllowed.
2332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      request_url_ = GURL("http://www.example.com/foo");
2333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      base::ListValue* list = new base::ListValue();
2334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (allow_rule) {
2335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        list->AppendString(allow_rule);
2336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        request_url_allowed_via_whitelist_ = true;
2337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      } else {
2338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        list->AppendString(ContentSettingsPattern::Wildcard().ToString());
233980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        // We should ignore all wildcard entries in the whitelist, so even
234080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        // though we've added an entry, it should be ignored and our expectation
234180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        // is that the request has not been allowed via the whitelist.
234280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        request_url_allowed_via_whitelist_ = false;
234380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      }
234480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      policies->Set(whitelist_policy, POLICY_LEVEL_MANDATORY,
234580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                    POLICY_SCOPE_USER, list, NULL);
2346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
234780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
234880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
234980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  void Accept(const content::MediaStreamDevices& devices,
235080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen              scoped_ptr<content::MediaStreamUI> ui) {
235180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    if (policy_value_ || request_url_allowed_via_whitelist_) {
235280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      ASSERT_EQ(1U, devices.size());
235380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      ASSERT_EQ("fake_dev", devices[0].id);
235480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    } else {
235580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      ASSERT_EQ(0U, devices.size());
2356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void FinishAudioTest() {
2360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    content::MediaStreamRequest request(0, 0, 0, std::string(),
2361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                        request_url_.GetOrigin(),
2362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                        content::MEDIA_DEVICE_ACCESS,
2363257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                        std::string(), std::string(),
2364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                        content::MEDIA_DEVICE_AUDIO_CAPTURE,
2365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                        content::MEDIA_NO_SERVICE);
2366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // TODO(raymes): Test MEDIA_DEVICE_OPEN (Pepper) which grants both webcam
2367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // and microphone permissions at the same time.
2368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    MediaStreamDevicesController controller(
2369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        browser()->tab_strip_model()->GetActiveWebContents(), request,
2370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Bind(&MediaStreamDevicesControllerBrowserTest::Accept, this));
2371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    controller.Accept(false);
2372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    base::MessageLoop::current()->QuitWhenIdle();
2374257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2375257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void FinishVideoTest() {
2377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // TODO(raymes): Test MEDIA_DEVICE_OPEN (Pepper) which grants both webcam
2378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // and microphone permissions at the same time.
2379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    content::MediaStreamRequest request(0, 0, 0, std::string(),
2380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                        request_url_.GetOrigin(),
2381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                        content::MEDIA_DEVICE_ACCESS,
2382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                        std::string(),
2383257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                        std::string(),
238480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                                        content::MEDIA_NO_SERVICE,
2385257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                        content::MEDIA_DEVICE_VIDEO_CAPTURE);
238680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    MediaStreamDevicesController controller(
2387257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        browser()->tab_strip_model()->GetActiveWebContents(), request,
2388257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        base::Bind(&MediaStreamDevicesControllerBrowserTest::Accept, this));
2389257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    controller.Accept(false);
2390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    base::MessageLoop::current()->QuitWhenIdle();
2392257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2393257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2394257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool policy_value_;
2395257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool request_url_allowed_via_whitelist_;
2396257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  GURL request_url_;
2397257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static const char kExampleRequestPattern[];
2398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
2399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// static
2401257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochconst char MediaStreamDevicesControllerBrowserTest::kExampleRequestPattern[] =
2402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    "http://[*.]example.com/";
240380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
2404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_P(MediaStreamDevicesControllerBrowserTest,
2405257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                       AudioCaptureAllowed) {
2406257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::MediaStreamDevices audio_devices;
2407257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::MediaStreamDevice fake_audio_device(
2408257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      content::MEDIA_DEVICE_AUDIO_CAPTURE, "fake_dev", "Fake Audio Device");
2409257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  audio_devices.push_back(fake_audio_device);
2410257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2411257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PolicyMap policies;
2412257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ConfigurePolicyMap(&policies, key::kAudioCaptureAllowed, NULL, NULL);
2413257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UpdateProviderPolicy(policies);
2414257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2415257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::BrowserThread::PostTaskAndReply(
2416257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      content::BrowserThread::IO, FROM_HERE,
2417257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      base::Bind(&MediaCaptureDevicesDispatcher::OnAudioCaptureDevicesChanged,
2418257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                 base::Unretained(MediaCaptureDevicesDispatcher::GetInstance()),
2419257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                 audio_devices),
242080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      base::Bind(&MediaStreamDevicesControllerBrowserTest::FinishAudioTest,
2421257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                 this));
2422257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2423257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  base::MessageLoop::current()->Run();
2424257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2425257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2426257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_P(MediaStreamDevicesControllerBrowserTest,
2427257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                       AudioCaptureAllowedUrls) {
2428257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::MediaStreamDevices audio_devices;
2429257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  content::MediaStreamDevice fake_audio_device(
2430257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      content::MEDIA_DEVICE_AUDIO_CAPTURE, "fake_dev", "Fake Audio Device");
2431257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  audio_devices.push_back(fake_audio_device);
243280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
2433257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const char* allow_pattern[] = {
2434257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kExampleRequestPattern,
2435257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // This will set an allow-all policy whitelist.  Since we do not allow
2436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // setting an allow-all entry in the whitelist, this entry should be ignored
2437257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // and therefore the request should be denied.
2438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    NULL,
243980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  };
244080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
244180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  for (size_t i = 0; i < arraysize(allow_pattern); ++i) {
244280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    PolicyMap policies;
244380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    ConfigurePolicyMap(&policies, key::kAudioCaptureAllowed,
244480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                       key::kAudioCaptureAllowedUrls, allow_pattern[i]);
244580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    UpdateProviderPolicy(policies);
244680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
244780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    content::BrowserThread::PostTaskAndReply(
244880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        content::BrowserThread::IO, FROM_HERE,
244980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::Bind(
245080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            &MediaCaptureDevicesDispatcher::OnAudioCaptureDevicesChanged,
245180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            base::Unretained(MediaCaptureDevicesDispatcher::GetInstance()),
245280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            audio_devices),
245380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::Bind(
245469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch            &MediaStreamDevicesControllerBrowserTest::FinishAudioTest,
245580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            this));
245680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
245780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    base::MessageLoop::current()->Run();
245880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
245980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
246080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
246144f0eee88ff00398ff7f715fab053374d808c90dSteve BlockIN_PROC_BROWSER_TEST_P(MediaStreamDevicesControllerBrowserTest,
246244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       VideoCaptureAllowed) {
246380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  content::MediaStreamDevices video_devices;
246480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  content::MediaStreamDevice fake_video_device(
246580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      content::MEDIA_DEVICE_VIDEO_CAPTURE, "fake_dev", "Fake Video Device");
246680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  video_devices.push_back(fake_video_device);
246780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
246880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  PolicyMap policies;
246944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ConfigurePolicyMap(&policies, key::kVideoCaptureAllowed, NULL, NULL);
247080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  UpdateProviderPolicy(policies);
247180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
247280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  content::BrowserThread::PostTaskAndReply(
2473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      content::BrowserThread::IO, FROM_HERE,
247480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      base::Bind(&MediaCaptureDevicesDispatcher::OnVideoCaptureDevicesChanged,
247580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                 base::Unretained(MediaCaptureDevicesDispatcher::GetInstance()),
247680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                 video_devices),
247780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      base::Bind(&MediaStreamDevicesControllerBrowserTest::FinishVideoTest,
247880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                 this));
247980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
248069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  base::MessageLoop::current()->Run();
248180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
248280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
248380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian MonsenIN_PROC_BROWSER_TEST_P(MediaStreamDevicesControllerBrowserTest,
248480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                       VideoCaptureAllowedUrls) {
248580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  content::MediaStreamDevices video_devices;
248680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  content::MediaStreamDevice fake_video_device(
248780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      content::MEDIA_DEVICE_VIDEO_CAPTURE, "fake_dev", "Fake Video Device");
248844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  video_devices.push_back(fake_video_device);
248980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
249080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  const char* allow_pattern[] = {
249180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    kExampleRequestPattern,
249280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    // This will set an allow-all policy whitelist.  Since we do not allow
249380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    // setting an allow-all entry in the whitelist, this entry should be ignored
249480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    // and therefore the request should be denied.
249544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    NULL,
249680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  };
249780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
249880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  for (size_t i = 0; i < arraysize(allow_pattern); ++i) {
2499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    PolicyMap policies;
250080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    ConfigurePolicyMap(&policies, key::kVideoCaptureAllowed,
250180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                       key::kVideoCaptureAllowedUrls, allow_pattern[i]);
250280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    UpdateProviderPolicy(policies);
250380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
250480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    content::BrowserThread::PostTaskAndReply(
2505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        content::BrowserThread::IO, FROM_HERE,
2506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Bind(
2507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            &MediaCaptureDevicesDispatcher::OnVideoCaptureDevicesChanged,
2508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            base::Unretained(MediaCaptureDevicesDispatcher::GetInstance()),
2509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            video_devices),
2510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        base::Bind(
2511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch            &MediaStreamDevicesControllerBrowserTest::FinishVideoTest,
251280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen            this));
251380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
2514257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    base::MessageLoop::current()->Run();
251580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
25163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
251780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
2518257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochINSTANTIATE_TEST_CASE_P(MediaStreamDevicesControllerBrowserTestInstance,
251980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                        MediaStreamDevicesControllerBrowserTest,
252080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                        testing::Bool());
252180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
252280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#if !defined(OS_CHROMEOS)
252380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// Similar to PolicyTest but sets the proper policy before the browser is
252480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// started.
252580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenclass PolicyVariationsServiceTest : public PolicyTest {
252680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen public:
252780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
252880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    PolicyTest::SetUpInProcessBrowserTestFixture();
252980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    PolicyMap policies;
253080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    policies.Set(
2531257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        key::kVariationsRestrictParameter,
253280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        POLICY_LEVEL_MANDATORY,
25333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        POLICY_SCOPE_USER,
253480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        base::Value::CreateStringValue("restricted"),
253580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen        NULL);
253680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    provider_.UpdateChromePolicy(policies);
253780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
25383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
253980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
2540257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIN_PROC_BROWSER_TEST_F(PolicyVariationsServiceTest, VariationsURLIsValid) {
254180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  const std::string default_variations_url =
254280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      chrome_variations::VariationsService::
254380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen          GetDefaultVariationsServerURLForTesting();
254480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
254580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  const GURL url =
254680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      chrome_variations::VariationsService::GetVariationsServerURL(
254780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen          g_browser_process->local_state());
254880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  EXPECT_TRUE(StartsWithASCII(url.spec(), default_variations_url, true));
254980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  std::string value;
255080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  EXPECT_TRUE(net::GetValueForKeyInQuery(url, "restrict", &value));
255180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  EXPECT_EQ("restricted", value);
255280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
255380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#endif
255480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
255580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}  // namespace policy
255680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen