OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/plugin_service_impl.h" | 5 #include "content/browser/plugin_service_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 class MockPluginProcessHostClient : public PluginProcessHost::Client, | 35 class MockPluginProcessHostClient : public PluginProcessHost::Client, |
36 public IPC::Listener { | 36 public IPC::Listener { |
37 public: | 37 public: |
38 MockPluginProcessHostClient(ResourceContext* context, bool expect_fail) | 38 MockPluginProcessHostClient(ResourceContext* context, bool expect_fail) |
39 : context_(context), | 39 : context_(context), |
40 channel_(NULL), | 40 channel_(NULL), |
41 set_plugin_info_called_(false), | 41 set_plugin_info_called_(false), |
42 expect_fail_(expect_fail) { | 42 expect_fail_(expect_fail) { |
43 } | 43 } |
44 | 44 |
45 virtual ~MockPluginProcessHostClient() { | 45 ~MockPluginProcessHostClient() override { |
46 if (channel_) | 46 if (channel_) |
47 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, channel_); | 47 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, channel_); |
48 } | 48 } |
49 | 49 |
50 // PluginProcessHost::Client implementation. | 50 // PluginProcessHost::Client implementation. |
51 virtual int ID() override { return 42; } | 51 int ID() override { return 42; } |
52 virtual bool OffTheRecord() override { return false; } | 52 bool OffTheRecord() override { return false; } |
53 virtual ResourceContext* GetResourceContext() override { | 53 ResourceContext* GetResourceContext() override { return context_; } |
54 return context_; | 54 void OnFoundPluginProcessHost(PluginProcessHost* host) override {} |
55 } | 55 void OnSentPluginChannelRequest() override {} |
56 virtual void OnFoundPluginProcessHost(PluginProcessHost* host) override {} | |
57 virtual void OnSentPluginChannelRequest() override {} | |
58 | 56 |
59 virtual void OnChannelOpened(const IPC::ChannelHandle& handle) override { | 57 void OnChannelOpened(const IPC::ChannelHandle& handle) override { |
60 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 58 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
61 ASSERT_TRUE(set_plugin_info_called_); | 59 ASSERT_TRUE(set_plugin_info_called_); |
62 ASSERT_TRUE(!channel_); | 60 ASSERT_TRUE(!channel_); |
63 channel_ = IPC::Channel::CreateClient(handle, this).release(); | 61 channel_ = IPC::Channel::CreateClient(handle, this).release(); |
64 ASSERT_TRUE(channel_->Connect()); | 62 ASSERT_TRUE(channel_->Connect()); |
65 } | 63 } |
66 | 64 |
67 virtual void SetPluginInfo(const WebPluginInfo& info) override { | 65 void SetPluginInfo(const WebPluginInfo& info) override { |
68 ASSERT_TRUE(info.mime_types.size()); | 66 ASSERT_TRUE(info.mime_types.size()); |
69 ASSERT_EQ(kNPAPITestPluginMimeType, info.mime_types[0].mime_type); | 67 ASSERT_EQ(kNPAPITestPluginMimeType, info.mime_types[0].mime_type); |
70 set_plugin_info_called_ = true; | 68 set_plugin_info_called_ = true; |
71 } | 69 } |
72 | 70 |
73 virtual void OnError() override { | 71 void OnError() override { Fail(); } |
74 Fail(); | |
75 } | |
76 | 72 |
77 // IPC::Listener implementation. | 73 // IPC::Listener implementation. |
78 virtual bool OnMessageReceived(const IPC::Message& message) override { | 74 bool OnMessageReceived(const IPC::Message& message) override { |
79 Fail(); | 75 Fail(); |
80 return false; | 76 return false; |
81 } | 77 } |
82 virtual void OnChannelConnected(int32 peer_pid) override { | 78 void OnChannelConnected(int32 peer_pid) override { |
83 if (expect_fail_) | 79 if (expect_fail_) |
84 FAIL(); | 80 FAIL(); |
85 QuitMessageLoop(); | 81 QuitMessageLoop(); |
86 } | 82 } |
87 virtual void OnChannelError() override { | 83 void OnChannelError() override { Fail(); } |
88 Fail(); | |
89 } | |
90 #if defined(OS_POSIX) | 84 #if defined(OS_POSIX) |
91 virtual void OnChannelDenied() override { | 85 void OnChannelDenied() override { Fail(); } |
92 Fail(); | 86 void OnChannelListenError() override { Fail(); } |
93 } | |
94 virtual void OnChannelListenError() override { | |
95 Fail(); | |
96 } | |
97 #endif | 87 #endif |
98 | 88 |
99 private: | 89 private: |
100 void Fail() { | 90 void Fail() { |
101 if (!expect_fail_) | 91 if (!expect_fail_) |
102 FAIL(); | 92 FAIL(); |
103 QuitMessageLoop(); | 93 QuitMessageLoop(); |
104 } | 94 } |
105 | 95 |
106 void QuitMessageLoop() { | 96 void QuitMessageLoop() { |
107 BrowserThread::PostTask( | 97 BrowserThread::PostTask( |
108 BrowserThread::UI, FROM_HERE, base::MessageLoop::QuitClosure()); | 98 BrowserThread::UI, FROM_HERE, base::MessageLoop::QuitClosure()); |
109 } | 99 } |
110 | 100 |
111 ResourceContext* context_; | 101 ResourceContext* context_; |
112 IPC::Channel* channel_; | 102 IPC::Channel* channel_; |
113 bool set_plugin_info_called_; | 103 bool set_plugin_info_called_; |
114 bool expect_fail_; | 104 bool expect_fail_; |
115 DISALLOW_COPY_AND_ASSIGN(MockPluginProcessHostClient); | 105 DISALLOW_COPY_AND_ASSIGN(MockPluginProcessHostClient); |
116 }; | 106 }; |
117 | 107 |
118 class MockPluginServiceFilter : public content::PluginServiceFilter { | 108 class MockPluginServiceFilter : public content::PluginServiceFilter { |
119 public: | 109 public: |
120 MockPluginServiceFilter() {} | 110 MockPluginServiceFilter() {} |
121 | 111 |
122 virtual bool IsPluginAvailable( | 112 bool IsPluginAvailable(int render_process_id, |
123 int render_process_id, | 113 int render_view_id, |
124 int render_view_id, | 114 const void* context, |
125 const void* context, | 115 const GURL& url, |
126 const GURL& url, | 116 const GURL& policy_url, |
127 const GURL& policy_url, | 117 WebPluginInfo* plugin) override { |
128 WebPluginInfo* plugin) override { return true; } | 118 return true; |
| 119 } |
129 | 120 |
130 virtual bool CanLoadPlugin( | 121 bool CanLoadPlugin(int render_process_id, |
131 int render_process_id, | 122 const base::FilePath& path) override { |
132 const base::FilePath& path) override { return false; } | 123 return false; |
| 124 } |
133 }; | 125 }; |
134 | 126 |
135 class PluginServiceTest : public ContentBrowserTest { | 127 class PluginServiceTest : public ContentBrowserTest { |
136 public: | 128 public: |
137 PluginServiceTest() {} | 129 PluginServiceTest() {} |
138 | 130 |
139 ResourceContext* GetResourceContext() { | 131 ResourceContext* GetResourceContext() { |
140 return shell()->web_contents()->GetBrowserContext()->GetResourceContext(); | 132 return shell()->web_contents()->GetBrowserContext()->GetResourceContext(); |
141 } | 133 } |
142 | 134 |
143 virtual void SetUpCommandLine(CommandLine* command_line) override { | 135 void SetUpCommandLine(CommandLine* command_line) override { |
144 #if defined(OS_MACOSX) | 136 #if defined(OS_MACOSX) |
145 base::FilePath browser_directory; | 137 base::FilePath browser_directory; |
146 PathService::Get(base::DIR_MODULE, &browser_directory); | 138 PathService::Get(base::DIR_MODULE, &browser_directory); |
147 command_line->AppendSwitchPath(switches::kExtraPluginDir, | 139 command_line->AppendSwitchPath(switches::kExtraPluginDir, |
148 browser_directory.AppendASCII("plugins")); | 140 browser_directory.AppendASCII("plugins")); |
149 #endif | 141 #endif |
150 // TODO(jam): since these plugin tests are running under Chrome, we need to | 142 // TODO(jam): since these plugin tests are running under Chrome, we need to |
151 // tell it to disable its security features for old plugins. Once this is | 143 // tell it to disable its security features for old plugins. Once this is |
152 // running under content_browsertests, these flags won't be needed. | 144 // running under content_browsertests, these flags won't be needed. |
153 // http://crbug.com/90448 | 145 // http://crbug.com/90448 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 class MockCanceledBeforeSentPluginProcessHostClient | 239 class MockCanceledBeforeSentPluginProcessHostClient |
248 : public MockCanceledPluginServiceClient { | 240 : public MockCanceledPluginServiceClient { |
249 public: | 241 public: |
250 MockCanceledBeforeSentPluginProcessHostClient( | 242 MockCanceledBeforeSentPluginProcessHostClient( |
251 ResourceContext* context) | 243 ResourceContext* context) |
252 : MockCanceledPluginServiceClient(context), | 244 : MockCanceledPluginServiceClient(context), |
253 set_plugin_info_called_(false), | 245 set_plugin_info_called_(false), |
254 on_found_plugin_process_host_called_(false), | 246 on_found_plugin_process_host_called_(false), |
255 host_(NULL) {} | 247 host_(NULL) {} |
256 | 248 |
257 virtual ~MockCanceledBeforeSentPluginProcessHostClient() {} | 249 ~MockCanceledBeforeSentPluginProcessHostClient() override {} |
258 | 250 |
259 // Client implementation. | 251 // Client implementation. |
260 virtual void SetPluginInfo(const WebPluginInfo& info) override { | 252 void SetPluginInfo(const WebPluginInfo& info) override { |
261 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 253 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
262 ASSERT_TRUE(info.mime_types.size()); | 254 ASSERT_TRUE(info.mime_types.size()); |
263 ASSERT_EQ(kNPAPITestPluginMimeType, info.mime_types[0].mime_type); | 255 ASSERT_EQ(kNPAPITestPluginMimeType, info.mime_types[0].mime_type); |
264 set_plugin_info_called_ = true; | 256 set_plugin_info_called_ = true; |
265 } | 257 } |
266 virtual void OnFoundPluginProcessHost(PluginProcessHost* host) override { | 258 void OnFoundPluginProcessHost(PluginProcessHost* host) override { |
267 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 259 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
268 set_on_found_plugin_process_host_called(); | 260 set_on_found_plugin_process_host_called(); |
269 set_host(host); | 261 set_host(host); |
270 // This gets called right before we request the plugin<=>renderer channel, | 262 // This gets called right before we request the plugin<=>renderer channel, |
271 // so we have to post a task to cancel it. | 263 // so we have to post a task to cancel it. |
272 base::MessageLoop::current()->PostTask( | 264 base::MessageLoop::current()->PostTask( |
273 FROM_HERE, | 265 FROM_HERE, |
274 base::Bind(&PluginProcessHost::CancelPendingRequest, | 266 base::Bind(&PluginProcessHost::CancelPendingRequest, |
275 base::Unretained(host), | 267 base::Unretained(host), |
276 this)); | 268 this)); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 EXPECT_TRUE(mock_client.on_found_plugin_process_host_called()); | 311 EXPECT_TRUE(mock_client.on_found_plugin_process_host_called()); |
320 } | 312 } |
321 | 313 |
322 class MockCanceledAfterSentPluginProcessHostClient | 314 class MockCanceledAfterSentPluginProcessHostClient |
323 : public MockCanceledBeforeSentPluginProcessHostClient { | 315 : public MockCanceledBeforeSentPluginProcessHostClient { |
324 public: | 316 public: |
325 MockCanceledAfterSentPluginProcessHostClient( | 317 MockCanceledAfterSentPluginProcessHostClient( |
326 ResourceContext* context) | 318 ResourceContext* context) |
327 : MockCanceledBeforeSentPluginProcessHostClient(context), | 319 : MockCanceledBeforeSentPluginProcessHostClient(context), |
328 on_sent_plugin_channel_request_called_(false) {} | 320 on_sent_plugin_channel_request_called_(false) {} |
329 virtual ~MockCanceledAfterSentPluginProcessHostClient() {} | 321 ~MockCanceledAfterSentPluginProcessHostClient() override {} |
330 | 322 |
331 // Client implementation. | 323 // Client implementation. |
332 | 324 |
333 virtual int ID() override { return 42; } | 325 int ID() override { return 42; } |
334 virtual bool OffTheRecord() override { return false; } | 326 bool OffTheRecord() override { return false; } |
335 | 327 |
336 // We override this guy again since we don't want to cancel yet. | 328 // We override this guy again since we don't want to cancel yet. |
337 virtual void OnFoundPluginProcessHost(PluginProcessHost* host) override { | 329 void OnFoundPluginProcessHost(PluginProcessHost* host) override { |
338 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 330 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
339 set_on_found_plugin_process_host_called(); | 331 set_on_found_plugin_process_host_called(); |
340 set_host(host); | 332 set_host(host); |
341 } | 333 } |
342 | 334 |
343 virtual void OnSentPluginChannelRequest() override { | 335 void OnSentPluginChannelRequest() override { |
344 on_sent_plugin_channel_request_called_ = true; | 336 on_sent_plugin_channel_request_called_ = true; |
345 host()->CancelSentRequest(this); | 337 host()->CancelSentRequest(this); |
346 BrowserThread::PostTask( | 338 BrowserThread::PostTask( |
347 BrowserThread::UI, FROM_HERE, base::MessageLoop::QuitClosure()); | 339 BrowserThread::UI, FROM_HERE, base::MessageLoop::QuitClosure()); |
348 } | 340 } |
349 | 341 |
350 bool on_sent_plugin_channel_request_called() const { | 342 bool on_sent_plugin_channel_request_called() const { |
351 return on_sent_plugin_channel_request_called_; | 343 return on_sent_plugin_channel_request_called_; |
352 } | 344 } |
353 | 345 |
(...skipping 14 matching lines...) Expand all Loading... |
368 BrowserThread::IO, FROM_HERE, | 360 BrowserThread::IO, FROM_HERE, |
369 base::Bind(&OpenChannel, &mock_client)); | 361 base::Bind(&OpenChannel, &mock_client)); |
370 RunMessageLoop(); | 362 RunMessageLoop(); |
371 EXPECT_TRUE(mock_client.get_resource_context_called()); | 363 EXPECT_TRUE(mock_client.get_resource_context_called()); |
372 EXPECT_TRUE(mock_client.set_plugin_info_called()); | 364 EXPECT_TRUE(mock_client.set_plugin_info_called()); |
373 EXPECT_TRUE(mock_client.on_found_plugin_process_host_called()); | 365 EXPECT_TRUE(mock_client.on_found_plugin_process_host_called()); |
374 EXPECT_TRUE(mock_client.on_sent_plugin_channel_request_called()); | 366 EXPECT_TRUE(mock_client.on_sent_plugin_channel_request_called()); |
375 } | 367 } |
376 | 368 |
377 } // namespace content | 369 } // namespace content |
OLD | NEW |