1 // Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
2 // reserved. Use of this source code is governed by a BSD-style license that
3 // can be found in the LICENSE file.
4
5 #include "libcef/browser/web_plugin_impl.h"
6
7 #include "libcef/browser/context.h"
8 #include "libcef/browser/thread_util.h"
9
10 #include "base/bind.h"
11 #include "base/files/file_path.h"
12 #include "content/browser/plugin_service_impl.h"
13
14 namespace {
15
PluginsCallbackImpl(CefRefPtr<CefWebPluginInfoVisitor> visitor,const std::vector<content::WebPluginInfo> & all_plugins)16 void PluginsCallbackImpl(
17 CefRefPtr<CefWebPluginInfoVisitor> visitor,
18 const std::vector<content::WebPluginInfo>& all_plugins) {
19 CEF_REQUIRE_UIT();
20
21 int count = 0;
22 int total = static_cast<int>(all_plugins.size());
23
24 std::vector<content::WebPluginInfo>::const_iterator it = all_plugins.begin();
25 for (; it != all_plugins.end(); ++it, ++count) {
26 CefRefPtr<CefWebPluginInfoImpl> info(new CefWebPluginInfoImpl(*it));
27 if (!visitor->Visit(info.get(), count, total))
28 break;
29 }
30 }
31
32 } // namespace
33
34 // CefWebPluginInfoImpl
35
CefWebPluginInfoImpl(const content::WebPluginInfo & plugin_info)36 CefWebPluginInfoImpl::CefWebPluginInfoImpl(
37 const content::WebPluginInfo& plugin_info)
38 : plugin_info_(plugin_info) {}
39
GetName()40 CefString CefWebPluginInfoImpl::GetName() {
41 return plugin_info_.name;
42 }
43
GetPath()44 CefString CefWebPluginInfoImpl::GetPath() {
45 return plugin_info_.path.value();
46 }
47
GetVersion()48 CefString CefWebPluginInfoImpl::GetVersion() {
49 return plugin_info_.version;
50 }
51
GetDescription()52 CefString CefWebPluginInfoImpl::GetDescription() {
53 return plugin_info_.desc;
54 }
55
56 // Global functions.
57
CefVisitWebPluginInfo(CefRefPtr<CefWebPluginInfoVisitor> visitor)58 void CefVisitWebPluginInfo(CefRefPtr<CefWebPluginInfoVisitor> visitor) {
59 // Verify that the context is in a valid state.
60 if (!CONTEXT_STATE_VALID()) {
61 NOTREACHED() << "context not valid";
62 return;
63 }
64
65 if (!visitor.get()) {
66 NOTREACHED() << "invalid parameter";
67 return;
68 }
69
70 if (CEF_CURRENTLY_ON_UIT()) {
71 content::PluginServiceImpl::GetInstance()->GetPlugins(
72 base::BindOnce(PluginsCallbackImpl, visitor));
73 } else {
74 // Execute on the UI thread.
75 CEF_POST_TASK(CEF_UIT, base::BindOnce(CefVisitWebPluginInfo, visitor));
76 }
77 }
78
CefRefreshWebPlugins()79 void CefRefreshWebPlugins() {
80 // Verify that the context is in a valid state.
81 if (!CONTEXT_STATE_VALID()) {
82 NOTREACHED() << "context not valid";
83 return;
84 }
85
86 // No thread affinity.
87 content::PluginServiceImpl::GetInstance()->RefreshPlugins();
88 }
89
CefUnregisterInternalWebPlugin(const CefString & path)90 void CefUnregisterInternalWebPlugin(const CefString& path) {
91 // Verify that the context is in a valid state.
92 if (!CONTEXT_STATE_VALID()) {
93 NOTREACHED() << "context not valid";
94 return;
95 }
96
97 if (path.empty()) {
98 NOTREACHED() << "invalid parameter";
99 return;
100 }
101
102 // No thread affinity.
103 content::PluginServiceImpl::GetInstance()->UnregisterInternalPlugin(
104 base::FilePath(path));
105 }
106
CefRegisterWebPluginCrash(const CefString & path)107 void CefRegisterWebPluginCrash(const CefString& path) {
108 // Verify that the context is in a valid state.
109 if (!CONTEXT_STATE_VALID()) {
110 NOTREACHED() << "context not valid";
111 return;
112 }
113
114 if (path.empty()) {
115 NOTREACHED() << "invalid parameter";
116 return;
117 }
118
119 if (CEF_CURRENTLY_ON_IOT()) {
120 content::PluginServiceImpl::GetInstance()->RegisterPluginCrash(
121 base::FilePath(path));
122 } else {
123 // Execute on the IO thread.
124 CEF_POST_TASK(CEF_IOT, base::BindOnce(CefRegisterWebPluginCrash, path));
125 }
126 }
127
CefIsWebPluginUnstable(const CefString & path,CefRefPtr<CefWebPluginUnstableCallback> callback)128 void CefIsWebPluginUnstable(const CefString& path,
129 CefRefPtr<CefWebPluginUnstableCallback> callback) {
130 // Verify that the context is in a valid state.
131 if (!CONTEXT_STATE_VALID()) {
132 NOTREACHED() << "context not valid";
133 return;
134 }
135
136 if (path.empty() || !callback.get()) {
137 NOTREACHED() << "invalid parameter";
138 return;
139 }
140
141 if (CEF_CURRENTLY_ON_IOT()) {
142 callback->IsUnstable(
143 path, content::PluginServiceImpl::GetInstance()->IsPluginUnstable(
144 base::FilePath(path)));
145 } else {
146 // Execute on the IO thread.
147 CEF_POST_TASK(CEF_IOT,
148 base::BindOnce(CefIsWebPluginUnstable, path, callback));
149 }
150 }
151