| Index: chrome/renderer/greasemonkey_slave.cc | 
| =================================================================== | 
| --- chrome/renderer/greasemonkey_slave.cc	(revision 0) | 
| +++ chrome/renderer/greasemonkey_slave.cc	(revision 0) | 
| @@ -0,0 +1,66 @@ | 
| +// 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. | 
| + | 
| +#include "chrome/renderer/greasemonkey_slave.h" | 
| + | 
| +#include "base/logging.h" | 
| +#include "base/pickle.h" | 
| +#include "base/shared_memory.h" | 
| + | 
| +GreasemonkeySlave::GreasemonkeySlave() : shared_memory_(NULL) { | 
| +} | 
| + | 
| +bool GreasemonkeySlave::UpdateScripts(SharedMemoryHandle shared_memory) { | 
| +  scripts_.clear(); | 
| + | 
| +  // Create the shared memory object. | 
| +  shared_memory_.reset(new SharedMemory(shared_memory, true)); // read-only | 
| +  if (!shared_memory_.get()) | 
| +    return false; | 
| + | 
| +  // First get the size of the memory block. | 
| +  if (!shared_memory_->Map(sizeof(Pickle::Header))) | 
| +    return false; | 
| +  Pickle::Header* pickle_header = | 
| +      reinterpret_cast<Pickle::Header*>(shared_memory_->memory()); | 
| + | 
| +  // Now map in the rest of the block. | 
| +  int pickle_size = sizeof(Pickle::Header) + pickle_header->payload_size; | 
| +  shared_memory_->Unmap(); | 
| +  if (!shared_memory_->Map(pickle_size)) | 
| +    return false; | 
| + | 
| +  // Unpickle scripts. | 
| +  void* iter = NULL; | 
| +  int num_scripts = 0; | 
| +  Pickle pickle(reinterpret_cast<char*>(shared_memory_->memory()), | 
| +                pickle_size); | 
| +  pickle.ReadInt(&iter, &num_scripts); | 
| + | 
| +  for (int i = 0; i < num_scripts; ++i) { | 
| +    const char* data = NULL; | 
| +    int data_length = 0; | 
| +    pickle.ReadData(&iter, &data, &data_length); | 
| + | 
| +    GreasemonkeyScript script; | 
| +    if (script.Parse(StringPiece(data, data_length))) { | 
| +      scripts_.push_back(script); | 
| +    } | 
| +  } | 
| + | 
| +  return true; | 
| +} | 
| + | 
| +bool GreasemonkeySlave::InjectScripts(WebFrame* frame) { | 
| +  // TODO(aa): Check script patterns here | 
| + | 
| +  for (std::vector<GreasemonkeyScript>::iterator script = scripts_.begin(); | 
| +       script != scripts_.end(); ++script) { | 
| +    // TODO(aa): Pass in URL to script when we have it. | 
| +    frame->ExecuteJavaScript(script->GetBody().as_string(), | 
| +                             "Greasemonkey Script"); | 
| +  } | 
| + | 
| +  return true; | 
| +} | 
|  |