Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_PROXY_H__ | 5 #ifndef V8_PROXY_H__ |
| 6 #define V8_PROXY_H__ | 6 #define V8_PROXY_H__ |
| 7 | 7 |
| 8 #include <v8.h> | 8 #include <v8.h> |
| 9 #include "v8_index.h" | 9 #include "v8_index.h" |
| 10 #include "v8_custom.h" | 10 #include "v8_custom.h" |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 269 static bool IsFromSameOrigin(Frame* target, bool report_error); | 269 static bool IsFromSameOrigin(Frame* target, bool report_error); |
| 270 | 270 |
| 271 // Check if it is safe to access the given node from the | 271 // Check if it is safe to access the given node from the |
| 272 // current security context. | 272 // current security context. |
| 273 static bool CheckNodeSecurity(Node* node); | 273 static bool CheckNodeSecurity(Node* node); |
| 274 | 274 |
| 275 // Return true if the current security context can access the target frame. | 275 // Return true if the current security context can access the target frame. |
| 276 static bool CanAccess(Frame* target); | 276 static bool CanAccess(Frame* target); |
| 277 | 277 |
| 278 // Create a V8 wrapper for a C pointer | 278 // Create a V8 wrapper for a C pointer |
| 279 static v8::Handle<v8::Value> WrapCPointer(void* cptr); | 279 static inline v8::Handle<v8::Value> WrapCPointer(void* cptr); |
| 280 | 280 |
| 281 static v8::Handle<v8::Value> CheckNewLegal(const v8::Arguments& args); | 281 static v8::Handle<v8::Value> CheckNewLegal(const v8::Arguments& args); |
| 282 | 282 |
| 283 // Take C pointer out of a v8 wrapper | 283 // Take C pointer out of a v8 wrapper |
| 284 template <class C> | 284 template <class C> |
| 285 static C* ExtractCPointer(v8::Handle<v8::Value> obj) { | 285 static C* ExtractCPointer(v8::Handle<v8::Value> obj) { |
| 286 return static_cast<C*>(ExtractCPointerImpl(obj)); | 286 return static_cast<C*>(ExtractCPointerImpl(obj)); |
| 287 } | 287 } |
| 288 | 288 |
| 289 | 289 |
| 290 static v8::Handle<v8::Script> CompileScript(v8::Handle<v8::String> code, | 290 static v8::Handle<v8::Script> CompileScript(v8::Handle<v8::String> code, |
| 291 const String& fileName, | 291 const String& fileName, |
| 292 int baseLine); | 292 int baseLine); |
| 293 | 293 |
| 294 | |
| 295 #ifndef NDEBUG | |
| 294 // Checks if a v8 value can be a DOM wrapper | 296 // Checks if a v8 value can be a DOM wrapper |
| 295 static bool MaybeDOMWrapper(v8::Handle<v8::Value> obj); | 297 static bool MaybeDOMWrapper(v8::Handle<v8::Value> value); |
| 298 #endif | |
| 296 | 299 |
| 297 // Sets contents of a DOM wrapper, returns false if | 300 // Sets contents of a DOM wrapper. |
| 298 // obj is not a DOM wrapper type | 301 static void SetDOMWrapper(v8::Handle<v8::Object> obj, int type, void* ptr); |
| 299 static bool SetDOMWrapper(v8::Handle<v8::Object> obj, int type, void* ptr); | |
| 300 | 302 |
| 301 static v8::Handle<v8::Object> LookupDOMWrapper( | 303 static v8::Handle<v8::Object> LookupDOMWrapper( |
| 302 V8ClassIndex::V8WrapperType type, v8::Handle<v8::Value> value); | 304 V8ClassIndex::V8WrapperType type, v8::Handle<v8::Value> value); |
| 303 | 305 |
| 304 // A helper function extract native object pointer from a DOM wrapper | 306 // A helper function extract native object pointer from a DOM wrapper |
| 305 // and cast to the specified type. | 307 // and cast to the specified type. |
| 306 template <class C> | 308 template <class C> |
| 307 static C* DOMWrapperToNative(v8::Handle<v8::Value> object) { | 309 static C* DOMWrapperToNative(v8::Handle<v8::Value> object) { |
| 308 if (!MaybeDOMWrapper(object)) | |
| 309 return 0; | |
| 310 return ExtractCPointer<C>( | |
| 311 v8::Handle<v8::Object>::Cast(object)->GetInternalField(0)); | |
| 312 } | |
| 313 | |
| 314 // A helper function extract native object pointer from a DOM wrapper | |
| 315 // and cast to the specified type. | |
| 316 template <class C> | |
| 317 static C* FastDOMWrapperToNative(v8::Handle<v8::Value> object) { | |
| 318 ASSERT(MaybeDOMWrapper(object)); | 310 ASSERT(MaybeDOMWrapper(object)); |
| 319 return ExtractCPointer<C>( | 311 return ExtractCPointer<C>( |
| 320 v8::Handle<v8::Object>::Cast(object)->GetInternalField(0)); | 312 v8::Handle<v8::Object>::Cast(object)->GetInternalField(0)); |
| 321 } | 313 } |
| 322 | 314 |
| 323 // A help function extract a node type pointer from a DOM wrapper. | 315 // A help function extract a node type pointer from a DOM wrapper. |
| 324 // Wrapped pointer must be cast to Node* first. | 316 // Wrapped pointer must be cast to Node* first. |
| 325 template <class C> | 317 template <class C> |
| 326 static C* DOMWrapperToNode(v8::Handle<v8::Value> object) { | 318 static C* DOMWrapperToNode(v8::Handle<v8::Value> value) { |
| 327 if (!MaybeDOMWrapper(object)) | 319 ASSERT(MaybeDOMWrapper(value)); |
| 328 return 0; | 320 |
| 321 v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(value); | |
| 322 | |
| 323 ASSERT(GetDOMWrapperType(object) == V8ClassIndex::NODE); | |
| 324 | |
| 329 v8::Handle<v8::Value> wrapper = | 325 v8::Handle<v8::Value> wrapper = |
| 330 v8::Handle<v8::Object>::Cast(object)->GetInternalField(0); | 326 object->GetInternalField(V8Custom::kDOMWrapperObjectIndex); |
| 331 return static_cast<C*>(ExtractCPointer<Node>(wrapper)); | 327 return static_cast<C*>(ExtractCPointer<Node>(wrapper)); |
| 332 } | 328 } |
| 333 | 329 |
| 334 static v8::Handle<v8::Value> ToV8Object(V8ClassIndex::V8WrapperType type, | 330 static v8::Handle<v8::Value> ToV8Object(V8ClassIndex::V8WrapperType type, |
| 335 void* imp); | 331 void* imp); |
| 336 | 332 // Fast-path for Node objects. |
| 337 template <class C> | 333 static v8::Handle<v8::Value> NodeToV8Object(Node* node); |
| 338 static C* FastToNativeObject(V8ClassIndex::V8WrapperType type, | |
| 339 v8::Handle<v8::Value> object) { | |
| 340 return static_cast<C*>(FastToNativeObjectImpl(type, object)); | |
| 341 } | |
| 342 | 334 |
| 343 template <class C> | 335 template <class C> |
| 344 static C* ToNativeObject(V8ClassIndex::V8WrapperType type, | 336 static C* ToNativeObject(V8ClassIndex::V8WrapperType type, |
| 345 v8::Handle<v8::Value> object) { | 337 v8::Handle<v8::Value> object) { |
| 346 return static_cast<C*>(ToNativeObjectImpl(type, object)); | 338 return static_cast<C*>(ToNativeObjectImpl(type, object)); |
| 347 } | 339 } |
| 348 | 340 |
| 349 static V8ClassIndex::V8WrapperType GetDOMWrapperType( | 341 static V8ClassIndex::V8WrapperType GetDOMWrapperType( |
| 350 v8::Handle<v8::Object> object); | 342 v8::Handle<v8::Object> object); |
| 351 | 343 |
| 352 // If the exception code is different from zero, a DOM exception is | 344 // If the exception code is different from zero, a DOM exception is |
| 353 // schedule to be thrown. | 345 // schedule to be thrown. |
| 354 static void SetDOMException(int exception_code); | 346 static void SetDOMException(int exception_code); |
| 355 | 347 |
| 356 // Schedule an error object to be thrown. | 348 // Schedule an error object to be thrown. |
| 357 static v8::Handle<v8::Value> ThrowError(ErrorType type, const char* message); | 349 static v8::Handle<v8::Value> ThrowError(ErrorType type, const char* message); |
| 358 | 350 |
| 359 // Create an instance of a function descriptor and set to the global object | 351 // Create an instance of a function descriptor and set to the global object |
| 360 // as a named property. Used by v8_test_shell. | 352 // as a named property. Used by v8_test_shell. |
| 361 static void BindJSObjectToWindow(Frame* frame, | 353 static void BindJSObjectToWindow(Frame* frame, |
| 362 const char* name, | 354 const char* name, |
| 363 int type, | 355 int type, |
| 364 v8::Handle<v8::FunctionTemplate> desc, | 356 v8::Handle<v8::FunctionTemplate> desc, |
| 365 void* imp); | 357 void* imp); |
| 366 | 358 |
| 367 static v8::Handle<v8::Value> EventToV8Object(Event* event); | 359 static v8::Handle<v8::Value> EventToV8Object(Event* event); |
| 368 static Event* ToNativeEvent(v8::Handle<v8::Value> jsevent) { | 360 static Event* ToNativeEvent(v8::Handle<v8::Value> jsevent) { |
| 361 if (!IsDOMEventWrapper(jsevent)) return 0; | |
| 369 return DOMWrapperToNative<Event>(jsevent); | 362 return DOMWrapperToNative<Event>(jsevent); |
| 370 } | 363 } |
| 371 | 364 |
| 372 static v8::Handle<v8::Value> EventTargetToV8Object(EventTarget* target); | 365 static v8::Handle<v8::Value> EventTargetToV8Object(EventTarget* target); |
| 373 // Wrap and unwrap JS event listeners | 366 // Wrap and unwrap JS event listeners |
| 374 static v8::Handle<v8::Value> EventListenerToV8Object(EventListener* target); | 367 static v8::Handle<v8::Value> EventListenerToV8Object(EventListener* target); |
| 375 | 368 |
| 376 // DOMImplementation is a singleton and it is handled in a special | 369 // DOMImplementation is a singleton and it is handled in a special |
| 377 // way. A wrapper is generated per document and stored in an | 370 // way. A wrapper is generated per document and stored in an |
| 378 // internal field of the document. When wrapping the | 371 // internal field of the document. When wrapping the |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 407 void* host, | 400 void* host, |
| 408 v8::Persistent<v8::Value> handle); | 401 v8::Persistent<v8::Value> handle); |
| 409 static void UnregisterGlobalHandle(void* host, | 402 static void UnregisterGlobalHandle(void* host, |
| 410 v8::Persistent<v8::Value> handle); | 403 v8::Persistent<v8::Value> handle); |
| 411 #endif | 404 #endif |
| 412 | 405 |
| 413 private: | 406 private: |
| 414 void initContextIfNeeded(); | 407 void initContextIfNeeded(); |
| 415 void DisconnectEventListeners(); | 408 void DisconnectEventListeners(); |
| 416 | 409 |
| 410 // Check whether a V8 value is a DOM Event wrapper | |
| 411 static bool IsDOMEventWrapper(v8::Handle<v8::Value> obj); | |
| 412 | |
| 417 static void* ToNativeObjectImpl(V8ClassIndex::V8WrapperType type, | 413 static void* ToNativeObjectImpl(V8ClassIndex::V8WrapperType type, |
| 418 v8::Handle<v8::Value> object); | 414 v8::Handle<v8::Value> object); |
| 419 static void* FastToNativeObjectImpl(V8ClassIndex::V8WrapperType type, | |
| 420 v8::Handle<v8::Value> object); | |
| 421 | 415 |
| 422 // Take C pointer out of a v8 wrapper | 416 // Take C pointer out of a v8 wrapper |
| 423 static void* ExtractCPointerImpl(v8::Handle<v8::Value> obj); | 417 static inline void* ExtractCPointerImpl(v8::Handle<v8::Value> obj); |
| 424 | 418 |
| 425 static v8::Handle<v8::Object> NodeToV8Object(Node* node); | 419 static v8::Handle<v8::Value> StyleSheetToV8Object(StyleSheet* sheet); |
| 426 static v8::Handle<v8::Object> StyleSheetToV8Object(StyleSheet* sheet); | 420 static v8::Handle<v8::Value> CSSValueToV8Object(CSSValue* value); |
| 427 static v8::Handle<v8::Object> CSSValueToV8Object(CSSValue* value); | 421 static v8::Handle<v8::Value> CSSRuleToV8Object(CSSRule* rule); |
| 428 static v8::Handle<v8::Object> CSSRuleToV8Object(CSSRule* rule); | |
| 429 // Returns the JS wrapper of a window object, initializes the environment | 422 // Returns the JS wrapper of a window object, initializes the environment |
| 430 // of the window frame if needed. | 423 // of the window frame if needed. |
| 431 static v8::Handle<v8::Object> WindowToV8Object(DOMWindow* window); | 424 static v8::Handle<v8::Value> WindowToV8Object(DOMWindow* window); |
| 432 | 425 |
| 433 #if ENABLE(SVG) | 426 #if ENABLE(SVG) |
| 434 static v8::Handle<v8::Object> SVGElementInstanceToV8Object( | 427 static v8::Handle<v8::Value> SVGElementInstanceToV8Object( |
| 435 SVGElementInstance* instance); | 428 SVGElementInstance* instance); |
| 436 static v8::Handle<v8::Object> SVGObjectWithContextToV8Object( | 429 static v8::Handle<v8::Value> SVGObjectWithContextToV8Object( |
| 437 Peerable* object, V8ClassIndex::V8WrapperType type); | 430 Peerable* object, V8ClassIndex::V8WrapperType type); |
| 438 #endif | 431 #endif |
| 439 | 432 |
| 440 // Set hidden references in a DOMWindow object of a frame. | 433 // Set hidden references in a DOMWindow object of a frame. |
| 441 static void SetHiddenWindowReference(Frame* frame, | 434 static void SetHiddenWindowReference(Frame* frame, |
| 442 const int internal_index, | 435 const int internal_index, |
| 443 v8::Handle<v8::Object> jsobj); | 436 v8::Handle<v8::Object> jsobj); |
| 444 | 437 |
| 445 static V8ClassIndex::V8WrapperType GetHTMLElementType(HTMLElement* elm); | 438 static V8ClassIndex::V8WrapperType GetHTMLElementType(HTMLElement* elm); |
| 446 | 439 |
| 440 // The first parameter, desc_type, specifies the function descriptor | |
| 441 // used to create JS object. The second parameter, cptr_type, specifies | |
| 442 // the type of third parameter, impl, for type casting. | |
| 443 // For example, a HTML element has HTMLELEMENT desc_type, but always | |
| 444 // use NODE as cptr_type. JS wrapper has store cptr_type and impl as | |
|
Mads Ager (chromium)
2008/09/23 06:45:09
JS wrapper has store -> JS wrappers store
Feng Qian
2008/09/23 21:46:04
Done.
| |
| 445 // internal fields. | |
| 447 static v8::Local<v8::Object> InstantiateV8Object( | 446 static v8::Local<v8::Object> InstantiateV8Object( |
| 448 V8ClassIndex::V8WrapperType type, void* impl); | 447 V8ClassIndex::V8WrapperType desc_type, |
| 448 V8ClassIndex::V8WrapperType cptr_type, | |
| 449 void* impl); | |
| 449 | 450 |
| 450 static const char* GetRangeExceptionName(int exception_code); | 451 static const char* GetRangeExceptionName(int exception_code); |
| 451 static const char* GetEventExceptionName(int exception_code); | 452 static const char* GetEventExceptionName(int exception_code); |
| 452 static const char* GetXMLHttpRequestExceptionName(int exception_code); | 453 static const char* GetXMLHttpRequestExceptionName(int exception_code); |
| 453 static const char* GetDOMExceptionName(int exception_code); | 454 static const char* GetDOMExceptionName(int exception_code); |
| 454 | 455 |
| 455 #if ENABLE(XPATH) | 456 #if ENABLE(XPATH) |
| 456 static const char* GetXPathExceptionName(int exception_code); | 457 static const char* GetXPathExceptionName(int exception_code); |
| 457 #endif | 458 #endif |
| 458 | 459 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 512 V8Proxy::SetDOMWrapper(args.Holder(), tag, obj); | 513 V8Proxy::SetDOMWrapper(args.Holder(), tag, obj); |
| 513 V8Proxy::SetJSWrapperForDOMObject( | 514 V8Proxy::SetJSWrapperForDOMObject( |
| 514 obj, v8::Persistent<v8::Object>::New(args.Holder())); | 515 obj, v8::Persistent<v8::Object>::New(args.Holder())); |
| 515 return args.Holder(); | 516 return args.Holder(); |
| 516 } | 517 } |
| 517 | 518 |
| 518 } // namespace WebCore | 519 } // namespace WebCore |
| 519 | 520 |
| 520 #endif // V8_PROXY_H__ | 521 #endif // V8_PROXY_H__ |
| 521 | 522 |
| OLD | NEW |