1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "webkit/plugins/npapi/plugin_utils.h"
#include <algorithm>
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/version.h"
#if defined(OS_WIN)
#include "ui/base/win/hwnd_util.h"
#endif
namespace webkit {
namespace npapi {
// Global variable used by the plugin quirk "die after unload".
bool g_forcefully_terminate_plugin_process = false;
void CreateVersionFromString(const base::string16& version_string,
Version* parsed_version) {
// Remove spaces and ')' from the version string,
// Replace any instances of 'r', ',' or '(' with a dot.
std::string version = UTF16ToASCII(version_string);
RemoveChars(version, ") ", &version);
std::replace(version.begin(), version.end(), 'd', '.');
std::replace(version.begin(), version.end(), 'r', '.');
std::replace(version.begin(), version.end(), ',', '.');
std::replace(version.begin(), version.end(), '(', '.');
std::replace(version.begin(), version.end(), '_', '.');
// Remove leading zeros from each of the version components.
std::string no_leading_zeros_version;
std::vector<std::string> numbers;
base::SplitString(version, '.', &numbers);
for (size_t i = 0; i < numbers.size(); ++i) {
size_t n = numbers[i].size();
size_t j = 0;
while (j < n && numbers[i][j] == '0') {
++j;
}
no_leading_zeros_version += (j < n) ? numbers[i].substr(j) : "0";
if (i != numbers.size() - 1) {
no_leading_zeros_version += ".";
}
}
*parsed_version = Version(no_leading_zeros_version);
}
bool NPAPIPluginsSupported() {
#if defined(OS_WIN) || defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(USE_AURA))
return true;
#else
return false;
#endif
}
void SetForcefullyTerminatePluginProcess(bool value) {
g_forcefully_terminate_plugin_process = value;
}
bool ShouldForcefullyTerminatePluginProcess() {
return g_forcefully_terminate_plugin_process;
}
#if defined(OS_WIN)
const char16 kNativeWindowClassName[] = L"NativeWindowClass";
const char16 kPluginNameAtomProperty[] = L"PluginNameAtom";
const char16 kPluginVersionAtomProperty[] = L"PluginVersionAtom";
const char16 kDummyActivationWindowName[] = L"DummyWindowForActivation";
namespace {
bool GetPluginPropertyFromWindow(
HWND window, const wchar_t* plugin_atom_property,
base::string16* plugin_property) {
ATOM plugin_atom = reinterpret_cast<ATOM>(
GetPropW(window, plugin_atom_property));
if (plugin_atom != 0) {
WCHAR plugin_property_local[MAX_PATH] = {0};
GlobalGetAtomNameW(plugin_atom,
plugin_property_local,
ARRAYSIZE(plugin_property_local));
*plugin_property = plugin_property_local;
return true;
}
return false;
}
} // namespace
bool IsPluginDelegateWindow(HWND window) {
return ui::GetClassName(window) == base::string16(kNativeWindowClassName);
}
// static
bool GetPluginNameFromWindow(
HWND window, base::string16* plugin_name) {
return IsPluginDelegateWindow(window) &&
GetPluginPropertyFromWindow(
window, kPluginNameAtomProperty, plugin_name);
}
// static
bool GetPluginVersionFromWindow(
HWND window, base::string16* plugin_version) {
return IsPluginDelegateWindow(window) &&
GetPluginPropertyFromWindow(
window, kPluginVersionAtomProperty, plugin_version);
}
bool IsDummyActivationWindow(HWND window) {
if (!IsWindow(window))
return false;
wchar_t window_title[MAX_PATH + 1] = {0};
if (GetWindowText(window, window_title, arraysize(window_title))) {
return (0 == lstrcmpiW(window_title, kDummyActivationWindowName));
}
return false;
}
HWND GetDefaultWindowParent() {
return GetDesktopWindow();
}
#endif
} // namespace npapi
} // namespace webkit
|