summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-10 18:02:22 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-10 18:02:22 +0000
commit8d5c43c4a9958b592565da16912fd44960aab906 (patch)
tree3cefd920d10a6355df674c3f05d542bba4777485 /webkit
parent1226abb3175f2386c071946f51f2a8b79061d695 (diff)
downloadchromium_src-8d5c43c4a9958b592565da16912fd44960aab906.zip
chromium_src-8d5c43c4a9958b592565da16912fd44960aab906.tar.gz
chromium_src-8d5c43c4a9958b592565da16912fd44960aab906.tar.bz2
Keep the internal plugin always loaded in a more efficient way (i.e. don't initialize it until it's needed).
Review URL: http://codereview.chromium.org/2747007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49418 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r--webkit/glue/plugins/plugin_lib.cc44
-rw-r--r--webkit/glue/plugins/plugin_lib.h4
2 files changed, 30 insertions, 18 deletions
diff --git a/webkit/glue/plugins/plugin_lib.cc b/webkit/glue/plugins/plugin_lib.cc
index 921ef5d..c335b51 100644
--- a/webkit/glue/plugins/plugin_lib.cc
+++ b/webkit/glue/plugins/plugin_lib.cc
@@ -61,11 +61,12 @@ void PluginLib::ShutdownAllPlugins() {
PluginLib::PluginLib(const WebPluginInfo& info,
const PluginEntryPoints* entry_points)
: web_plugin_info_(info),
- library_(0),
+ library_(NULL),
initialized_(false),
saved_data_(0),
instance_count_(0),
- skip_unload_(false) {
+ skip_unload_(false),
+ always_loaded_(false) {
StatsCounter(kPluginLibrariesLoadedCounter).Increment();
memset((void*)&plugin_funcs_, 0, sizeof(plugin_funcs_));
g_loaded_libs->push_back(this);
@@ -132,6 +133,11 @@ void PluginLib::PreventLibraryUnload() {
skip_unload_ = true;
}
+void PluginLib::EnsureAlwaysLoaded() {
+ always_loaded_ = true;
+ Load();
+}
+
PluginInstance* PluginLib::CreateInstance(const std::string& mime_type) {
PluginInstance* new_instance = new PluginInstance(this, mime_type);
instance_count_++;
@@ -145,30 +151,18 @@ void PluginLib::CloseInstance() {
instance_count_--;
// If a plugin is running in its own process it will get unloaded on process
// shutdown.
- if ((instance_count_ == 0) &&
- webkit_glue::IsPluginRunningInRendererProcess()) {
+ if ((instance_count_ == 0) && webkit_glue::IsPluginRunningInRendererProcess())
Unload();
- for (size_t i = 0; i < g_loaded_libs->size(); ++i) {
- if ((*g_loaded_libs)[i].get() == this) {
- g_loaded_libs->erase(g_loaded_libs->begin() + i);
- break;
- }
- }
- if (g_loaded_libs->empty()) {
- delete g_loaded_libs;
- g_loaded_libs = NULL;
- }
- }
}
bool PluginLib::Load() {
+ if (library_)
+ return true;
+
bool rv = false;
base::NativeLibrary library = 0;
if (!internal_) {
- if (library_ != 0)
- return rv;
-
library = base::LoadNativeLibrary(web_plugin_info_.path);
if (library == 0)
return rv;
@@ -254,6 +248,9 @@ class FreePluginLibraryTask : public Task {
};
void PluginLib::Unload() {
+ if (always_loaded_)
+ return;
+
if (!internal_ && library_) {
// In case of single process mode, a plugin can delete itself
// by executing a script. So delay the unloading of the library
@@ -282,6 +279,17 @@ void PluginLib::Unload() {
library_ = 0;
}
+
+ for (size_t i = 0; i < g_loaded_libs->size(); ++i) {
+ if ((*g_loaded_libs)[i].get() == this) {
+ g_loaded_libs->erase(g_loaded_libs->begin() + i);
+ break;
+ }
+ }
+ if (g_loaded_libs->empty()) {
+ delete g_loaded_libs;
+ g_loaded_libs = NULL;
+ }
}
void PluginLib::Shutdown() {
diff --git a/webkit/glue/plugins/plugin_lib.h b/webkit/glue/plugins/plugin_lib.h
index dc0b304..53568f1 100644
--- a/webkit/glue/plugins/plugin_lib.h
+++ b/webkit/glue/plugins/plugin_lib.h
@@ -78,6 +78,9 @@ class PluginLib : public base::RefCounted<PluginLib> {
// some plugins crash if unloaded).
void PreventLibraryUnload();
+ // Loads the library now and ensures it's never unloaded.
+ void EnsureAlwaysLoaded();
+
private:
friend class base::RefCounted<PluginLib>;
@@ -107,6 +110,7 @@ class PluginLib : public base::RefCounted<PluginLib> {
NPSavedData *saved_data_; // Persisted plugin info for NPAPI.
int instance_count_; // Count of plugins in use.
bool skip_unload_; // True if library_ should not be unloaded.
+ bool always_loaded_; // True if should always keep this loaded.
// Function pointers to entry points into the plugin.
PluginEntryPoints entry_points_;