1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/plugins/plugin_info_message_filter.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/at_exit.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind_helpers.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/message_loop/message_loop.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/run_loop.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/pref_names.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/render_messages.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/plugin_service.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/plugin_service_filter.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using content::PluginService;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PluginsLoaded(const base::Closure& callback,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   const std::vector<content::WebPluginInfo>& plugins) {
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  callback.Run();
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class FakePluginServiceFilter : public content::PluginServiceFilter {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FakePluginServiceFilter() {}
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~FakePluginServiceFilter() {}
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool IsPluginAvailable(int render_process_id,
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 int render_view_id,
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const void* context,
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const GURL& url,
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const GURL& policy_url,
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 content::WebPluginInfo* plugin) OVERRIDE;
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool CanLoadPlugin(int render_process_id,
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             const base::FilePath& path) OVERRIDE;
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void set_plugin_enabled(const base::FilePath& plugin_path, bool enabled) {
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    plugin_state_[plugin_path] = enabled;
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::map<base::FilePath, bool> plugin_state_;
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool FakePluginServiceFilter::IsPluginAvailable(
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int render_process_id,
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int render_view_id,
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const void* context,
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const GURL& url,
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const GURL& policy_url,
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::WebPluginInfo* plugin) {
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::map<base::FilePath, bool>::iterator it =
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      plugin_state_.find(plugin->path);
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (it == plugin_state_.end()) {
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ADD_FAILURE() << "No plug-in state for '" << plugin->path.value() << "'";
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return it->second;
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool FakePluginServiceFilter::CanLoadPlugin(int render_process_id,
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            const base::FilePath& path) {
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return true;
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PluginInfoMessageFilterTest : public ::testing::Test {
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PluginInfoMessageFilterTest() :
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      foo_plugin_path_(FILE_PATH_LITERAL("/path/to/foo")),
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      bar_plugin_path_(FILE_PATH_LITERAL("/path/to/bar")),
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      context_(0, &profile_) {
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::WebPluginInfo foo_plugin(base::ASCIIToUTF16("Foo Plug-in"),
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      foo_plugin_path_,
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      base::ASCIIToUTF16("1"),
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      base::ASCIIToUTF16("The Foo plug-in."));
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::WebPluginMimeType mime_type;
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    mime_type.mime_type = "foo/bar";
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    foo_plugin.mime_types.push_back(mime_type);
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    foo_plugin.type = content::WebPluginInfo::PLUGIN_TYPE_PEPPER_IN_PROCESS;
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PluginService::GetInstance()->Init();
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PluginService::GetInstance()->RegisterInternalPlugin(foo_plugin, false);
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::WebPluginInfo bar_plugin(base::ASCIIToUTF16("Bar Plug-in"),
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      bar_plugin_path_,
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      base::ASCIIToUTF16("1"),
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      base::ASCIIToUTF16("The Bar plug-in."));
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    mime_type.mime_type = "foo/bar";
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bar_plugin.mime_types.push_back(mime_type);
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bar_plugin.type = content::WebPluginInfo::PLUGIN_TYPE_PEPPER_IN_PROCESS;
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PluginService::GetInstance()->RegisterInternalPlugin(bar_plugin, false);
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PluginService::GetInstance()->SetFilter(&filter_);
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_WIN)
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Can't go out of process in unit tests.
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::RenderProcessHost::SetRunRendererInProcess(true);
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::RunLoop run_loop;
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PluginService::GetInstance()->GetPlugins(
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::Bind(&PluginsLoaded, run_loop.QuitClosure()));
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop.Run();
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_WIN)
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::RenderProcessHost::SetRunRendererInProcess(false);
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestingProfile* profile() {
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return &profile_;
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PluginInfoMessageFilter::Context* context() {
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return &context_;
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void VerifyPluginContentSetting(const GURL& url,
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const std::string& plugin,
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  ContentSetting expected_setting,
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  bool expected_is_default,
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  bool expected_is_managed) {
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ContentSetting setting = expected_setting == CONTENT_SETTING_DEFAULT ?
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        CONTENT_SETTING_BLOCK : CONTENT_SETTING_DEFAULT;
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool is_default = !expected_is_default;
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool is_managed = !expected_is_managed;
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    context()->GetPluginContentSetting(
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        content::WebPluginInfo(), url, url, plugin,
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        &setting, &is_default, &is_managed);
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(expected_setting, setting);
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(expected_is_default, is_default);
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(expected_is_managed, is_managed);
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath foo_plugin_path_;
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath bar_plugin_path_;
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FakePluginServiceFilter filter_;
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ShadowingAtExitManager at_exit_manager_;  // Destroys the PluginService.
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::TestBrowserThreadBundle test_thread_bundle;
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestingProfile profile_;
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PluginInfoMessageFilter::Context context_;
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PluginInfoMessageFilterTest, FindEnabledPlugin) {
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  filter_.set_plugin_enabled(foo_plugin_path_, true);
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  filter_.set_plugin_enabled(bar_plugin_path_, true);
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  {
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ChromeViewHostMsg_GetPluginInfo_Status status;
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::WebPluginInfo plugin;
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string actual_mime_type;
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(context()->FindEnabledPlugin(
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        0, GURL(), GURL(), "foo/bar", &status, &plugin, &actual_mime_type,
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        NULL));
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kAllowed, status.value);
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(foo_plugin_path_.value(), plugin.path.value());
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  filter_.set_plugin_enabled(foo_plugin_path_, false);
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  {
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ChromeViewHostMsg_GetPluginInfo_Status status;
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::WebPluginInfo plugin;
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string actual_mime_type;
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(context()->FindEnabledPlugin(
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        0, GURL(), GURL(), "foo/bar", &status, &plugin, &actual_mime_type,
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        NULL));
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kAllowed, status.value);
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(bar_plugin_path_.value(), plugin.path.value());
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  filter_.set_plugin_enabled(bar_plugin_path_, false);
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  {
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ChromeViewHostMsg_GetPluginInfo_Status status;
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::WebPluginInfo plugin;
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string actual_mime_type;
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string identifier;
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::string16 plugin_name;
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(context()->FindEnabledPlugin(
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        0, GURL(), GURL(), "foo/bar", &status, &plugin, &actual_mime_type,
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        NULL));
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kDisabled, status.value);
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(foo_plugin_path_.value(), plugin.path.value());
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  {
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ChromeViewHostMsg_GetPluginInfo_Status status;
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::WebPluginInfo plugin;
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::string actual_mime_type;
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(context()->FindEnabledPlugin(
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        0, GURL(), GURL(), "baz/blurp", &status, &plugin, &actual_mime_type,
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        NULL));
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kNotFound, status.value);
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(FILE_PATH_LITERAL(""), plugin.path.value());
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PluginInfoMessageFilterTest, GetPluginContentSetting) {
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  HostContentSettingsMap* map = profile()->GetHostContentSettingsMap();
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Block plugins by default.
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  map->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_PLUGINS,
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                CONTENT_SETTING_BLOCK);
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set plugins to click-to-play on example.com and subdomains.
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ContentSettingsPattern pattern =
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       ContentSettingsPattern::FromString("[*.]example.com");
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  map->SetContentSetting(pattern,
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         ContentSettingsPattern::Wildcard(),
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         CONTENT_SETTINGS_TYPE_PLUGINS,
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         std::string(),
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         CONTENT_SETTING_ASK);
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Allow plugin "foo" on all sites.
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  map->SetContentSetting(ContentSettingsPattern::Wildcard(),
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         ContentSettingsPattern::Wildcard(),
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         CONTENT_SETTINGS_TYPE_PLUGINS,
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         "foo",
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         CONTENT_SETTING_ALLOW);
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL unmatched_host("https://www.google.com");
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL host("http://example.com/");
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(CONTENT_SETTING_BLOCK, map->GetContentSetting(
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      unmatched_host, unmatched_host, CONTENT_SETTINGS_TYPE_PLUGINS,
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      std::string()));
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      host, host, CONTENT_SETTINGS_TYPE_PLUGINS, std::string()));
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(CONTENT_SETTING_ALLOW, map->GetContentSetting(
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      host, host, CONTENT_SETTINGS_TYPE_PLUGINS, "foo"));
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(CONTENT_SETTING_DEFAULT, map->GetContentSetting(
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      host, host, CONTENT_SETTINGS_TYPE_PLUGINS, "bar"));
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // "foo" is allowed everywhere.
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyPluginContentSetting(host, "foo", CONTENT_SETTING_ALLOW, false, false);
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // There is no specific content setting for "bar", so the general setting
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // for example.com applies.
252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyPluginContentSetting(host, "bar", CONTENT_SETTING_ASK, false, false);
253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Otherwise, use the default.
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyPluginContentSetting(unmatched_host, "bar", CONTENT_SETTING_BLOCK,
256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             true, false);
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Block plugins via policy.
259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestingPrefServiceSyncable* prefs = profile()->GetTestingPrefService();
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  prefs->SetManagedPref(prefs::kManagedDefaultPluginsSetting,
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        new base::FundamentalValue(CONTENT_SETTING_BLOCK));
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // All plugins should be blocked now.
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyPluginContentSetting(host, "foo", CONTENT_SETTING_BLOCK, true, true);
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyPluginContentSetting(host, "bar", CONTENT_SETTING_BLOCK, true, true);
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyPluginContentSetting(unmatched_host, "bar", CONTENT_SETTING_BLOCK,
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             true, true);
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
269