• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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