summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/user_script_master.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/user_script_master.h')
-rw-r--r--chrome/browser/extensions/user_script_master.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/chrome/browser/extensions/user_script_master.h b/chrome/browser/extensions/user_script_master.h
new file mode 100644
index 0000000..4798bb2
--- /dev/null
+++ b/chrome/browser/extensions/user_script_master.h
@@ -0,0 +1,76 @@
+// Copyright (c) 2008 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.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_MASTER_H_
+#define CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_MASTER_H_
+
+#include "base/directory_watcher.h"
+#include "base/file_path.h"
+#include "base/process.h"
+#include "base/scoped_ptr.h"
+#include "base/shared_memory.h"
+
+class MessageLoop;
+
+// Manages a segment of shared memory that contains the user scripts the user
+// has installed. Lives on the UI thread.
+class UserScriptMaster : public base::RefCounted<UserScriptMaster>,
+ public DirectoryWatcher::Delegate {
+ public:
+ // For testability, the constructor takes the MessageLoop to run the
+ // script-reloading worker on as well as the path the scripts live in.
+ // These are normally the file thread and a directory inside the profile.
+ UserScriptMaster(MessageLoop* worker, const FilePath& script_dir);
+ ~UserScriptMaster();
+
+ // Gets the segment of shared memory for the scripts.
+ base::SharedMemory* GetSharedMemory() const {
+ return shared_memory_.get();
+ }
+
+ // Called by the script reloader when new scripts have been loaded.
+ void NewScriptsAvailable(base::SharedMemory* handle);
+
+ // Return true if we have any scripts ready.
+ bool ScriptsReady() const { return shared_memory_.get() != NULL; }
+
+ // Returns the path to the directory user scripts are stored in.
+ FilePath user_script_dir() const { return *user_script_dir_; }
+
+ private:
+ class ScriptReloader;
+
+ // DirectoryWatcher::Delegate implementation.
+ virtual void OnDirectoryChanged(const FilePath& path);
+
+ // Kicks off a process on the file thread to reload scripts from disk
+ // into a new chunk of shared memory and notify renderers.
+ void StartScan();
+
+ // The directory containing user scripts.
+ scoped_ptr<FilePath> user_script_dir_;
+
+ // The watcher watches the profile's user scripts directory for new scripts.
+ scoped_ptr<DirectoryWatcher> dir_watcher_;
+
+ // The MessageLoop that the scanner worker runs on.
+ // Typically the file thread; configurable for testing.
+ MessageLoop* worker_loop_;
+
+ // ScriptReloader (in another thread) reloads script off disk.
+ // We hang on to our pointer to know if we've already got one running.
+ scoped_refptr<ScriptReloader> script_reloader_;
+
+ // Contains the scripts that were found the last time scripts were updated.
+ scoped_ptr<base::SharedMemory> shared_memory_;
+
+ // If the script directory is modified while we're rescanning it, we note
+ // that we're currently mid-scan and then start over again once the scan
+ // finishes. This boolean tracks whether another scan is pending.
+ bool pending_scan_;
+
+ DISALLOW_COPY_AND_ASSIGN(UserScriptMaster);
+};
+
+#endif // CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_MASTER_H_