Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/JsValue.cpp

Issue 10727002: Get rid of dependencies on v8.h in public header files (Closed)
Patch Set: Added helper class to make using v8 values via auto_ptr less awkward Created May 23, 2013, 4:08 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <http://adblockplus.org/>, 2 * This file is part of Adblock Plus <http://adblockplus.org/>,
3 * Copyright (C) 2006-2013 Eyeo GmbH 3 * Copyright (C) 2006-2013 Eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details. 12 * GNU General Public License for more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License 14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */ 16 */
17 17
18 #include <vector>
18 #include <AdblockPlus.h> 19 #include <AdblockPlus.h>
19 #include <vector> 20
20 21 #include "JsContext.h"
21 namespace 22 #include "JsError.h"
22 { 23 #include "Utils.h"
23 std::string fromV8String(v8::Handle<v8::Value> value)
24 {
25 v8::String::Utf8Value stringValue(value);
26 if (stringValue.length())
27 return std::string(*stringValue, stringValue.length());
28 else
29 return std::string();
30 }
31
32 v8::Local<v8::String> toV8String(const std::string& str)
33 {
34 return v8::String::New(str.c_str(), str.length());
35 }
36 }
37 24
38 AdblockPlus::JsValue::JsValue(AdblockPlus::JsEnginePtr jsEngine, 25 AdblockPlus::JsValue::JsValue(AdblockPlus::JsEnginePtr jsEngine,
39 v8::Handle<v8::Value> value) 26 v8::Handle<v8::Value> value)
40 : jsEngine(jsEngine), 27 : jsEngine(jsEngine),
41 value(v8::Persistent<v8::Value>::New(jsEngine->isolate, value)) 28 value(jsEngine->isolate, value)
42 { 29 {
43 } 30 }
44 31
45 AdblockPlus::JsValue::JsValue(AdblockPlus::JsValuePtr value) 32 AdblockPlus::JsValue::JsValue(AdblockPlus::JsValuePtr value)
46 : jsEngine(value->jsEngine), 33 : jsEngine(value->jsEngine),
47 value(v8::Persistent<v8::Value>::New(jsEngine->isolate, value->value)) 34 value(value->value)
48 { 35 {
49 } 36 }
50 37
51 AdblockPlus::JsValue::~JsValue() 38 AdblockPlus::JsValue::~JsValue()
52 { 39 {
53 value.Dispose(jsEngine->isolate);
54 } 40 }
55 41
56 bool AdblockPlus::JsValue::IsUndefined() const 42 bool AdblockPlus::JsValue::IsUndefined() const
57 { 43 {
58 const JsEngine::Context context(jsEngine); 44 const JsContext context(jsEngine);
59 return value->IsUndefined(); 45 return value->IsUndefined();
60 } 46 }
61 47
62 bool AdblockPlus::JsValue::IsNull() const 48 bool AdblockPlus::JsValue::IsNull() const
63 { 49 {
64 const JsEngine::Context context(jsEngine); 50 const JsContext context(jsEngine);
65 return value->IsNull(); 51 return value->IsNull();
66 } 52 }
67 53
68 bool AdblockPlus::JsValue::IsString() const 54 bool AdblockPlus::JsValue::IsString() const
69 { 55 {
70 const JsEngine::Context context(jsEngine); 56 const JsContext context(jsEngine);
71 return value->IsString() || value->IsStringObject(); 57 return value->IsString() || value->IsStringObject();
72 } 58 }
73 59
74 bool AdblockPlus::JsValue::IsNumber() const 60 bool AdblockPlus::JsValue::IsNumber() const
75 { 61 {
76 const JsEngine::Context context(jsEngine); 62 const JsContext context(jsEngine);
77 return value->IsNumber() || value->IsNumberObject(); 63 return value->IsNumber() || value->IsNumberObject();
78 } 64 }
79 65
80 bool AdblockPlus::JsValue::IsBool() const 66 bool AdblockPlus::JsValue::IsBool() const
81 { 67 {
82 const JsEngine::Context context(jsEngine); 68 const JsContext context(jsEngine);
83 return value->IsBoolean() || value->IsBooleanObject(); 69 return value->IsBoolean() || value->IsBooleanObject();
84 } 70 }
85 71
86 bool AdblockPlus::JsValue::IsObject() const 72 bool AdblockPlus::JsValue::IsObject() const
87 { 73 {
88 const JsEngine::Context context(jsEngine); 74 const JsContext context(jsEngine);
89 return value->IsObject(); 75 return value->IsObject();
90 } 76 }
91 77
92 bool AdblockPlus::JsValue::IsArray() const 78 bool AdblockPlus::JsValue::IsArray() const
93 { 79 {
94 const JsEngine::Context context(jsEngine); 80 const JsContext context(jsEngine);
95 return value->IsArray(); 81 return value->IsArray();
96 } 82 }
97 83
98 bool AdblockPlus::JsValue::IsFunction() const 84 bool AdblockPlus::JsValue::IsFunction() const
99 { 85 {
100 const JsEngine::Context context(jsEngine); 86 const JsContext context(jsEngine);
101 return value->IsFunction(); 87 return value->IsFunction();
102 } 88 }
103 89
104 std::string AdblockPlus::JsValue::AsString() const 90 std::string AdblockPlus::JsValue::AsString() const
105 { 91 {
106 const JsEngine::Context context(jsEngine); 92 const JsContext context(jsEngine);
107 return fromV8String(value); 93 return Utils::FromV8String(value);
108 } 94 }
109 95
110 int64_t AdblockPlus::JsValue::AsInt() const 96 int64_t AdblockPlus::JsValue::AsInt() const
111 { 97 {
112 const JsEngine::Context context(jsEngine); 98 const JsContext context(jsEngine);
113 return value->IntegerValue(); 99 return value->IntegerValue();
114 } 100 }
115 101
116 bool AdblockPlus::JsValue::AsBool() const 102 bool AdblockPlus::JsValue::AsBool() const
117 { 103 {
118 const JsEngine::Context context(jsEngine); 104 const JsContext context(jsEngine);
119 return value->BooleanValue(); 105 return value->BooleanValue();
120 } 106 }
121 107
122 AdblockPlus::JsValueList AdblockPlus::JsValue::AsList() const 108 AdblockPlus::JsValueList AdblockPlus::JsValue::AsList() const
123 { 109 {
124 if (!IsArray()) 110 if (!IsArray())
125 throw std::runtime_error("Cannot convert a non-array to list"); 111 throw std::runtime_error("Cannot convert a non-array to list");
126 112
127 const JsEngine::Context context(jsEngine); 113 const JsContext context(jsEngine);
128 JsValueList result; 114 JsValueList result;
129 v8::Persistent<v8::Array> array = v8::Persistent<v8::Array>::Cast(value); 115 v8::Persistent<v8::Array> array = v8::Persistent<v8::Array>::Cast<v8::Value>(v alue);
130 uint32_t length = array->Length(); 116 uint32_t length = array->Length();
131 for (uint32_t i = 0; i < length; i++) 117 for (uint32_t i = 0; i < length; i++)
132 { 118 {
133 v8::Local<v8::Value> item = array->Get(i); 119 v8::Local<v8::Value> item = array->Get(i);
134 result.push_back(JsValuePtr(new JsValue(jsEngine, item))); 120 result.push_back(JsValuePtr(new JsValue(jsEngine, item)));
135 } 121 }
136 return result; 122 return result;
137 } 123 }
138 124
139 std::vector<std::string> AdblockPlus::JsValue::GetOwnPropertyNames() const 125 std::vector<std::string> AdblockPlus::JsValue::GetOwnPropertyNames() const
140 { 126 {
141 if (!IsObject()) 127 if (!IsObject())
142 throw new std::runtime_error("Attempting to get propert list for a non-objec t"); 128 throw new std::runtime_error("Attempting to get propert list for a non-objec t");
143 129
144 const JsEngine::Context context(jsEngine); 130 const JsContext context(jsEngine);
145 const v8::Persistent<v8::Object> object = v8::Persistent<v8::Object>::Cast(val ue); 131 const v8::Persistent<v8::Object> object = v8::Persistent<v8::Object>::Cast<v8: :Value>(value);
146 JsValueList properties = JsValuePtr(new JsValue(jsEngine, object->GetOwnProper tyNames()))->AsList(); 132 JsValueList properties = JsValuePtr(new JsValue(jsEngine, object->GetOwnProper tyNames()))->AsList();
147 std::vector<std::string> result; 133 std::vector<std::string> result;
148 for (JsValueList::iterator it = properties.begin(); it != properties.end(); ++ it) 134 for (JsValueList::iterator it = properties.begin(); it != properties.end(); ++ it)
149 result.push_back((*it)->AsString()); 135 result.push_back((*it)->AsString());
150 return result; 136 return result;
151 } 137 }
152 138
153 139
154 AdblockPlus::JsValuePtr AdblockPlus::JsValue::GetProperty(const std::string& nam e) const 140 AdblockPlus::JsValuePtr AdblockPlus::JsValue::GetProperty(const std::string& nam e) const
155 { 141 {
156 if (!IsObject()) 142 if (!IsObject())
157 throw new std::runtime_error("Attempting to get property of a non-object"); 143 throw new std::runtime_error("Attempting to get property of a non-object");
158 144
159 const JsEngine::Context context(jsEngine); 145 const JsContext context(jsEngine);
160 v8::Local<v8::String> property = toV8String(name); 146 v8::Local<v8::String> property = Utils::ToV8String(name);
161 v8::Persistent<v8::Object> obj = v8::Persistent<v8::Object>::Cast(value); 147 v8::Persistent<v8::Object> obj = v8::Persistent<v8::Object>::Cast<v8::Value>(v alue);
162 return JsValuePtr(new JsValue(jsEngine, obj->Get(property))); 148 return JsValuePtr(new JsValue(jsEngine, obj->Get(property)));
163 } 149 }
164 150
165 void AdblockPlus::JsValue::SetProperty(const std::string& name, v8::Handle<v8::V alue> val) 151 void AdblockPlus::JsValue::SetProperty(const std::string& name, v8::Handle<v8::V alue> val)
166 { 152 {
167 if (!IsObject()) 153 if (!IsObject())
168 throw new std::runtime_error("Attempting to set property on a non-object"); 154 throw new std::runtime_error("Attempting to set property on a non-object");
169 155
170 v8::Local<v8::String> property = toV8String(name); 156 v8::Local<v8::String> property = Utils::ToV8String(name);
171 v8::Persistent<v8::Object> obj = v8::Persistent<v8::Object>::Cast(value); 157 v8::Persistent<v8::Object> obj = v8::Persistent<v8::Object>::Cast<v8::Value>(v alue);
172 obj->Set(property, val); 158 obj->Set(property, val);
173 } 159 }
174 160
175 void AdblockPlus::JsValue::SetProperty(const std::string& name, const std::strin g& val) 161 void AdblockPlus::JsValue::SetProperty(const std::string& name, const std::strin g& val)
176 { 162 {
177 const JsEngine::Context context(jsEngine); 163 const JsContext context(jsEngine);
178 SetProperty(name, toV8String(val)); 164 SetProperty(name, Utils::ToV8String(val));
179 } 165 }
180 166
181 void AdblockPlus::JsValue::SetProperty(const std::string& name, int64_t val) 167 void AdblockPlus::JsValue::SetProperty(const std::string& name, int64_t val)
182 { 168 {
183 const JsEngine::Context context(jsEngine); 169 const JsContext context(jsEngine);
184 SetProperty(name, v8::Number::New(val)); 170 SetProperty(name, v8::Number::New(val));
185 } 171 }
186 172
187 void AdblockPlus::JsValue::SetProperty(const std::string& name, JsValuePtr val) 173 void AdblockPlus::JsValue::SetProperty(const std::string& name, JsValuePtr val)
188 { 174 {
189 const JsEngine::Context context(jsEngine); 175 const JsContext context(jsEngine);
190 SetProperty(name, val->value); 176 SetProperty(name, val->value);
191 } 177 }
192 178
193 void AdblockPlus::JsValue::SetProperty(const std::string& name, bool val) 179 void AdblockPlus::JsValue::SetProperty(const std::string& name, bool val)
194 { 180 {
195 const JsEngine::Context context(jsEngine); 181 const JsContext context(jsEngine);
196 SetProperty(name, v8::Boolean::New(val)); 182 SetProperty(name, v8::Boolean::New(val));
197 } 183 }
198 184
199 std::string AdblockPlus::JsValue::GetClass() const 185 std::string AdblockPlus::JsValue::GetClass() const
200 { 186 {
201 if (!IsObject()) 187 if (!IsObject())
202 throw new std::runtime_error("Cannot get constructor of a non-object"); 188 throw new std::runtime_error("Cannot get constructor of a non-object");
203 189
204 const JsEngine::Context context(jsEngine); 190 const JsContext context(jsEngine);
205 v8::Persistent<v8::Object> obj = v8::Persistent<v8::Object>::Cast(value); 191 v8::Persistent<v8::Object> obj = v8::Persistent<v8::Object>::Cast<v8::Value>(v alue);
206 return fromV8String(obj->GetConstructorName()); 192 return Utils::FromV8String(obj->GetConstructorName());
207 } 193 }
208 194
209 AdblockPlus::JsValuePtr AdblockPlus::JsValue::Call( 195 AdblockPlus::JsValuePtr AdblockPlus::JsValue::Call(
210 const JsValueList& params, 196 const JsValueList& params,
211 AdblockPlus::JsValuePtr thisPtr) const 197 AdblockPlus::JsValuePtr thisPtr) const
212 { 198 {
213 if (!IsFunction()) 199 if (!IsFunction())
214 throw new std::runtime_error("Attempting to call a non-function"); 200 throw new std::runtime_error("Attempting to call a non-function");
215 201
216 const JsEngine::Context context(jsEngine); 202 const JsContext context(jsEngine);
217 203
218 if (!thisPtr) 204 if (!thisPtr)
219 thisPtr = JsValuePtr(new JsValue(jsEngine, jsEngine->context->Global())); 205 thisPtr = JsValuePtr(new JsValue(jsEngine, jsEngine->context->Global()));
220 if (!thisPtr->IsObject()) 206 if (!thisPtr->IsObject())
221 throw new std::runtime_error("`this` pointer has to be an object"); 207 throw new std::runtime_error("`this` pointer has to be an object");
222 v8::Persistent<v8::Object> thisObj = v8::Persistent<v8::Object>::Cast(thisPtr- >value); 208 v8::Persistent<v8::Object> thisObj = v8::Persistent<v8::Object>::Cast<v8::Valu e>(thisPtr->value);
223 209
224 std::vector<v8::Handle<v8::Value> > argv; 210 std::vector<v8::Handle<v8::Value> > argv;
225 for (JsValueList::const_iterator it = params.begin(); it != params.end(); ++it ) 211 for (JsValueList::const_iterator it = params.begin(); it != params.end(); ++it )
226 argv.push_back((*it)->value); 212 argv.push_back((*it)->value);
227 213
228 const v8::TryCatch tryCatch; 214 const v8::TryCatch tryCatch;
229 v8::Persistent<v8::Function> func = v8::Persistent<v8::Function>::Cast(value); 215 v8::Persistent<v8::Function> func = v8::Persistent<v8::Function>::Cast<v8::Val ue>(value);
230 v8::Local<v8::Value> result = func->Call(thisObj, argv.size(), 216 v8::Local<v8::Value> result = func->Call(thisObj, argv.size(),
231 argv.size() ? &argv.front() : 0); 217 argv.size() ? &argv.front() : 0);
232 218
233 if (tryCatch.HasCaught()) 219 if (tryCatch.HasCaught())
234 throw AdblockPlus::JsError(tryCatch.Exception(), tryCatch.Message()); 220 throw AdblockPlus::JsError(tryCatch.Exception(), tryCatch.Message());
235 221
236 return JsValuePtr(new JsValue(jsEngine, result)); 222 return JsValuePtr(new JsValue(jsEngine, result));
237 } 223 }
OLDNEW

Powered by Google App Engine
This is Rietveld