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
|
// Copyright (c) 2006-2009 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/glue/plugins/plugin_list.h"
#import <Foundation/Foundation.h>
#include "base/file_util.h"
#include "base/mac_util.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "webkit/glue/plugins/plugin_lib.h"
namespace {
void GetPluginCommonDirectory(std::vector<FilePath>* plugin_dirs,
bool user) {
// Note that there are no NSSearchPathDirectory constants for these
// directories so we can't use Cocoa's NSSearchPathForDirectoriesInDomains().
// Interestingly, Safari hard-codes the location (see
// WebKit/WebKit/mac/Plugins/WebPluginDatabase.mm's +_defaultPlugInPaths).
FSRef ref;
OSErr err = FSFindFolder(user ? kUserDomain : kLocalDomain,
kInternetPlugInFolderType, false, &ref);
if (err)
return;
plugin_dirs->push_back(FilePath(mac_util::PathFromFSRef(ref)));
}
// Returns true if the plugin should be prevented from loading.
bool IsBlacklistedPlugin(const WebPluginInfo& info) {
// We blacklist Gears by included MIME type, since that is more stable than
// its name. Be careful about adding any more plugins to this list though,
// since it's easy to accidentally blacklist plugins that support lots of
// MIME types.
for (std::vector<WebPluginMimeType>::const_iterator i =
info.mime_types.begin(); i != info.mime_types.end(); ++i) {
// The Gears plugin is Safari-specific, so don't load it.
if (i->mime_type == "application/x-googlegears")
return true;
}
return false;
}
} // namespace
namespace NPAPI
{
void PluginList::PlatformInit() {
}
void PluginList::GetPluginDirectories(std::vector<FilePath>* plugin_dirs) {
// Load from the user's area
GetPluginCommonDirectory(plugin_dirs, true);
// Load from the machine-wide area
GetPluginCommonDirectory(plugin_dirs, false);
}
void PluginList::LoadPluginsFromDir(const FilePath &path,
std::vector<WebPluginInfo>* plugins,
std::set<FilePath>* visited_plugins) {
file_util::FileEnumerator enumerator(path,
false, // not recursive
file_util::FileEnumerator::DIRECTORIES);
for (FilePath path = enumerator.Next(); !path.value().empty();
path = enumerator.Next()) {
LoadPlugin(path, plugins);
visited_plugins->insert(path);
}
}
bool PluginList::ShouldLoadPlugin(const WebPluginInfo& info,
std::vector<WebPluginInfo>* plugins) {
if (IsBlacklistedPlugin(info))
return false;
// Flip4Mac has a reproducible hang during a synchronous call from the render
// with certain content types (as well as a common crash). Disable by default
// to minimize those issues, but don't blacklist it so that users can choose
// to enable it.
if (StartsWith(info.name, ASCIIToUTF16("Flip4Mac Windows Media Plugin"),
false))
DisablePlugin(info.path);
// Hierarchy check
// (we're loading plugins hierarchically from Library folders, so plugins we
// encounter earlier must override plugins we encounter later)
for (size_t i = 0; i < plugins->size(); ++i) {
if ((*plugins)[i].path.BaseName() == info.path.BaseName()) {
return false; // We already have a loaded plugin higher in the hierarchy.
}
}
return true;
}
} // namespace NPAPI
|