| Index: chrome/browser/render_process_host.cc
|
| ===================================================================
|
| --- chrome/browser/render_process_host.cc (revision 3492)
|
| +++ chrome/browser/render_process_host.cc (working copy)
|
| @@ -21,6 +21,7 @@
|
| #include "base/process_util.h"
|
| #include "base/rand_util.h"
|
| #include "base/shared_memory.h"
|
| +#include "base/singleton.h"
|
| #include "base/string_util.h"
|
| #include "base/sys_info.h"
|
| #include "base/thread.h"
|
| @@ -38,6 +39,7 @@
|
| #include "chrome/browser/sandbox_policy.h"
|
| #include "chrome/browser/spellchecker.h"
|
| #include "chrome/browser/visitedlink_master.h"
|
| +#include "chrome/browser/greasemonkey_master.h"
|
| #include "chrome/browser/web_contents.h"
|
| #include "chrome/common/chrome_constants.h"
|
| #include "chrome/common/chrome_paths.h"
|
| @@ -268,6 +270,7 @@
|
| switches::kDisablePopupBlocking,
|
| switches::kUseLowFragHeapCrt,
|
| switches::kGearsInRenderer,
|
| + switches::kEnableGreasemonkey,
|
| };
|
|
|
| for (int i = 0; i < arraysize(switch_names); ++i) {
|
| @@ -423,29 +426,60 @@
|
| // Now that the process is created, set it's backgrounding accordingly.
|
| SetBackgrounded(backgrounded_);
|
|
|
| - VisitedLinkMaster* visitedlink_master = profile_->GetVisitedLinkMaster();
|
| - if (visitedlink_master) {
|
| - std::wstring history_table_name = visitedlink_master->GetSharedMemoryName();
|
| - SharedMemoryHandle handle_for_process = NULL;
|
| - HANDLE target_process = process_.handle();
|
| - if (!target_process) {
|
| - // Target process can be null if it's started with the --single-process
|
| - // flag.
|
| - target_process = GetCurrentProcess();
|
| - }
|
| + // Send the process its initial VisitedLink and Greasemonkey data.
|
| + HANDLE target_process = process_.handle();
|
| + if (!target_process) {
|
| + // Target process can be null if it's started with the --single-process
|
| + // flag.
|
| + target_process = GetCurrentProcess();
|
| + }
|
|
|
| - visitedlink_master->ShareToProcess(target_process, &handle_for_process);
|
| - DCHECK(handle_for_process);
|
| + InitVisitedLinks(target_process);
|
| + InitGreasemonkeyScripts(target_process);
|
|
|
| - channel_->Send(new ViewMsg_VisitedLink_NewTable(handle_for_process));
|
| - }
|
| -
|
| if (max_page_id_ != -1)
|
| channel_->Send(new ViewMsg_SetNextPageID(max_page_id_ + 1));
|
|
|
| return true;
|
| }
|
|
|
| +void RenderProcessHost::InitVisitedLinks(HANDLE target_process) {
|
| + VisitedLinkMaster* visitedlink_master = profile_->GetVisitedLinkMaster();
|
| + if (!visitedlink_master) return;
|
| +
|
| + SharedMemoryHandle handle_for_process = NULL;
|
| + visitedlink_master->ShareToProcess(target_process, &handle_for_process);
|
| + DCHECK(handle_for_process);
|
| + if (handle_for_process) {
|
| + channel_->Send(new ViewMsg_VisitedLink_NewTable(handle_for_process));
|
| + }
|
| +}
|
| +
|
| +void RenderProcessHost::InitGreasemonkeyScripts(HANDLE target_process) {
|
| + CommandLine command_line;
|
| + if (!command_line.HasSwitch(switches::kEnableGreasemonkey)) return;
|
| +
|
| + // TODO(aa): Figure out lifetime and ownership of this object
|
| + // - VisitedLinkMaster is owned by Profile, but there has been talk of
|
| + // having scripts live elsewhere besides the profile.
|
| + // - File IO should be asynchronous (see VisitedLinkMaster), but how do we
|
| + // get scripts to the first renderer without blocking startup? Should we
|
| + // cache some information across restarts?
|
| + GreasemonkeyMaster* greasemonkey_master =
|
| + Singleton<GreasemonkeyMaster>::get();
|
| + if (!greasemonkey_master) return;
|
| +
|
| + // TODO(aa): This does blocking IO. Move to background thread.
|
| + greasemonkey_master->UpdateScripts();
|
| +
|
| + SharedMemoryHandle handle_for_process = NULL;
|
| + greasemonkey_master->ShareToProcess(target_process, &handle_for_process);
|
| + DCHECK(handle_for_process);
|
| + if (handle_for_process) {
|
| + channel_->Send(new ViewMsg_Greasemonkey_NewScripts(handle_for_process));
|
| + }
|
| +}
|
| +
|
| void RenderProcessHost::Attach(IPC::Channel::Listener* listener,
|
| int routing_id) {
|
| listeners_.AddWithID(listener, routing_id);
|
|
|