| 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;
|
| +}
|
|
|