blob: 7a230178352fe33fe9d725ab8ec820a0a01f8a19 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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;
}
|