| OLD | NEW |
| 1 // Copyright (c) 2008, Google Inc. | 1 // Copyright (c) 2008, Google Inc. |
| 2 // All rights reserved. | 2 // All rights reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
| 9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
| 10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 | 29 |
| 30 #include "config.h" | 30 #include "config.h" |
| 31 | 31 |
| 32 #include <algorithm> | 32 #include <algorithm> |
| 33 #include <utility> | 33 #include <utility> |
| 34 | 34 |
| 35 #include <v8.h> | 35 #include <v8.h> |
| 36 #include <v8-debug.h> | 36 #include <v8-debug.h> |
| 37 | 37 |
| 38 #include "v8_proxy.h" | 38 #include "v8_proxy.h" |
| 39 #include "dom_wrapper_map.h" |
| 39 #include "v8_index.h" | 40 #include "v8_index.h" |
| 40 #include "v8_binding.h" | 41 #include "v8_binding.h" |
| 41 #include "v8_custom.h" | 42 #include "v8_custom.h" |
| 42 #include "v8_nodefilter.h" | 43 #include "v8_nodefilter.h" |
| 43 #include "V8Collection.h" | 44 #include "V8Collection.h" |
| 44 #include "V8DOMWindow.h" | 45 #include "V8DOMWindow.h" |
| 45 | 46 |
| 46 #include "ChromiumBridge.h" | 47 #include "ChromiumBridge.h" |
| 47 #include "DOMObjectsInclude.h" | 48 |
| 49 #include "BarInfo.h" |
| 50 #include "CanvasGradient.h" |
| 51 #include "CanvasPattern.h" |
| 52 #include "CanvasPixelArray.h" |
| 53 #include "CanvasRenderingContext2D.h" |
| 54 #include "CanvasStyle.h" |
| 55 #include "CharacterData.h" |
| 56 #include "ClientRect.h" |
| 57 #include "ClientRectList.h" |
| 58 #include "Clipboard.h" |
| 59 #include "Console.h" |
| 60 #include "Counter.h" |
| 61 #include "CSSCharsetRule.h" |
| 62 #include "CSSFontFaceRule.h" |
| 63 #include "CSSImportRule.h" |
| 64 #include "CSSMediaRule.h" |
| 65 #include "CSSPageRule.h" |
| 66 #include "CSSRule.h" |
| 67 #include "CSSRuleList.h" |
| 68 #include "CSSValueList.h" |
| 69 #include "CSSStyleRule.h" |
| 70 #include "CSSStyleSheet.h" |
| 71 #include "CSSVariablesDeclaration.h" |
| 72 #include "CSSVariablesRule.h" |
| 73 #include "Database.h" |
| 74 #include "DocumentType.h" |
| 75 #include "DocumentFragment.h" |
| 76 #include "DOMCoreException.h" |
| 77 #include "DOMImplementation.h" |
| 78 #include "DOMParser.h" |
| 79 #include "DOMSelection.h" |
| 80 #include "DOMStringList.h" |
| 81 #include "DOMWindow.h" |
| 82 #include "Entity.h" |
| 83 #include "EventListener.h" |
| 84 #include "EventTarget.h" |
| 85 #include "Event.h" |
| 86 #include "EventException.h" |
| 87 #include "ExceptionCode.h" |
| 88 #include "File.h" |
| 89 #include "FileList.h" |
| 90 #include "Frame.h" |
| 91 #include "FrameLoader.h" |
| 92 #include "FrameTree.h" |
| 93 #include "History.h" |
| 94 #include "HTMLNames.h" |
| 95 #include "HTMLDocument.h" |
| 96 #include "HTMLElement.h" |
| 97 #include "HTMLImageElement.h" |
| 98 #include "HTMLInputElement.h" |
| 99 #include "HTMLSelectElement.h" |
| 100 #include "HTMLOptionsCollection.h" |
| 101 #include "ImageData.h" |
| 102 #include "InspectorController.h" |
| 103 #include "KeyboardEvent.h" |
| 104 #include "Location.h" |
| 105 #include "MediaError.h" |
| 106 #include "MediaList.h" |
| 107 #include "MediaPlayer.h" |
| 108 #include "MessageChannel.h" |
| 109 #include "MessageEvent.h" |
| 110 #include "MessagePort.h" |
| 111 #include "MimeTypeArray.h" |
| 112 #include "MouseEvent.h" |
| 113 #include "MutationEvent.h" |
| 114 #include "Navigator.h" // for MimeTypeArray |
| 115 #include "NodeFilter.h" |
| 116 #include "Notation.h" |
| 117 #include "NodeList.h" |
| 118 #include "NodeIterator.h" |
| 119 #include "OverflowEvent.h" |
| 120 #include "Page.h" |
| 121 #include "Plugin.h" |
| 122 #include "PluginArray.h" |
| 123 #include "ProcessingInstruction.h" |
| 124 #include "ProgressEvent.h" |
| 125 #include "Range.h" |
| 126 #include "RangeException.h" |
| 127 #include "Rect.h" |
| 128 #include "RGBColor.h" |
| 129 #include "Screen.h" |
| 130 #include "ScriptExecutionContext.h" |
| 131 #include "SecurityOrigin.h" |
| 132 #include "Settings.h" |
| 133 #include "SQLTransaction.h" |
| 134 #include "SQLResultSet.h" |
| 135 #include "SQLResultSetRowList.h" |
| 136 #include "StyleSheet.h" |
| 137 #include "StyleSheetList.h" |
| 138 #include "SVGColor.h" |
| 139 #include "SVGPaint.h" |
| 140 #include "TextEvent.h" |
| 141 #include "TextMetrics.h" |
| 142 #include "TimeRanges.h" |
| 143 #include "TreeWalker.h" |
| 144 #include "XSLTProcessor.h" |
| 145 #include "V8AbstractEventListener.h" |
| 146 #include "V8CustomEventListener.h" |
| 147 #include "V8DOMWindow.h" |
| 148 #include "V8HTMLElement.h" |
| 149 #include "V8LazyEventListener.h" |
| 150 #include "V8ObjectEventListener.h" |
| 151 #include "WebKitAnimationEvent.h" |
| 152 #include "WebKitCSSKeyframeRule.h" |
| 153 #include "WebKitCSSKeyframesRule.h" |
| 154 #include "WebKitCSSMatrix.h" |
| 155 #include "WebKitCSSTransformValue.h" |
| 156 #include "WebKitPoint.h" |
| 157 #include "WebKitTransitionEvent.h" |
| 158 #include "WheelEvent.h" |
| 159 #include "XMLHttpRequest.h" |
| 160 #include "XMLHttpRequestException.h" |
| 161 #include "XMLHttpRequestProgressEvent.h" |
| 162 #include "XMLHttpRequestUpload.h" |
| 163 #include "XMLSerializer.h" |
| 164 #include "XPathException.h" |
| 165 #include "XPathExpression.h" |
| 166 #include "XPathNSResolver.h" |
| 167 #include "XPathResult.h" |
| 168 |
| 48 | 169 |
| 49 #include "ScriptController.h" | 170 #include "ScriptController.h" |
| 50 | 171 |
| 172 #if ENABLE(SVG) |
| 173 #include "SVGAngle.h" |
| 174 #include "SVGAnimatedPoints.h" |
| 175 #include "SVGElement.h" |
| 176 #include "SVGElementInstance.h" |
| 177 #include "SVGElementInstanceList.h" |
| 178 #include "SVGException.h" |
| 179 #include "SVGLength.h" |
| 180 #include "SVGLengthList.h" |
| 181 #include "SVGNumberList.h" |
| 182 #include "SVGPathSeg.h" |
| 183 #include "SVGPathSegArc.h" |
| 184 #include "SVGPathSegClosePath.h" |
| 185 #include "SVGPathSegCurvetoCubic.h" |
| 186 #include "SVGPathSegCurvetoCubicSmooth.h" |
| 187 #include "SVGPathSegCurvetoQuadratic.h" |
| 188 #include "SVGPathSegCurvetoQuadraticSmooth.h" |
| 189 #include "SVGPathSegLineto.h" |
| 190 #include "SVGPathSegLinetoHorizontal.h" |
| 191 #include "SVGPathSegLinetoVertical.h" |
| 192 #include "SVGPathSegList.h" |
| 193 #include "SVGPathSegMoveto.h" |
| 194 #include "SVGPointList.h" |
| 195 #include "SVGPreserveAspectRatio.h" |
| 196 #include "SVGRenderingIntent.h" |
| 197 #include "SVGStringList.h" |
| 198 #include "SVGTransform.h" |
| 199 #include "SVGTransformList.h" |
| 200 #include "SVGUnitTypes.h" |
| 201 #include "SVGURIReference.h" |
| 202 #include "SVGZoomEvent.h" |
| 203 #include "V8SVGPODTypeWrapper.h" |
| 204 #endif // SVG |
| 205 |
| 206 #if ENABLE(WORKERS) |
| 207 #include "Worker.h" |
| 208 #include "WorkerContext.h" |
| 209 #include "WorkerLocation.h" |
| 210 #include "WorkerNavigator.h" |
| 211 #endif // WORKERS |
| 212 |
| 213 #if ENABLE(XPATH) |
| 214 #include "XPathEvaluator.h" |
| 215 #endif |
| 216 |
| 217 |
| 51 namespace WebCore { | 218 namespace WebCore { |
| 52 | 219 |
| 220 |
| 221 // DOM binding algorithm: |
| 222 // |
| 223 // There are two kinds of DOM objects: |
| 224 // 1. DOM tree nodes, such as Document, HTMLElement, ... |
| 225 // there classes implements TreeShared<T> interface; |
| 226 // 2. Non-node DOM objects, such as CSSRule, Location, etc. |
| 227 // these classes implement a ref-counted scheme. |
| 228 // |
| 229 // A DOM object may have a JS wrapper object. If a tree node |
| 230 // is alive, its JS wrapper must be kept alive even it is not |
| 231 // reachable from JS roots. |
| 232 // However, JS wrappers of non-node objects can go away if |
| 233 // not reachable from other JS objects. It works like a cache. |
| 234 // |
| 235 // DOM objects are ref-counted, and JS objects are traced from |
| 236 // a set of root objects. They can create a cycle. To break |
| 237 // cycles, we do following: |
| 238 // Handles from DOM objects to JS wrappers are always weak, |
| 239 // so JS wrappers of non-node object cannot create a cycle. |
| 240 // Before starting a global GC, we create a virtual connection |
| 241 // between nodes in the same tree in the JS heap. If the wrapper |
| 242 // of one node in a tree is alive, wrappers of all nodes in |
| 243 // the same tree are considered alive. This is done by creating |
| 244 // object groups in GC prologue callbacks. The mark-compact |
| 245 // collector will remove these groups after each GC. |
| 246 |
| 247 |
| 53 // Static utility context. | 248 // Static utility context. |
| 54 v8::Persistent<v8::Context> V8Proxy::m_utilityContext; | 249 v8::Persistent<v8::Context> V8Proxy::m_utilityContext; |
| 55 | 250 |
| 56 // Static list of registered extensions | 251 // Static list of registered extensions |
| 57 V8ExtensionList V8Proxy::m_extensions; | 252 V8ExtensionList V8Proxy::m_extensions; |
| 58 | 253 |
| 59 | 254 |
| 255 // A helper class for undetectable document.all |
| 256 class UndetectableHTMLCollection : public HTMLCollection { |
| 257 }; |
| 258 |
| 60 #ifndef NDEBUG | 259 #ifndef NDEBUG |
| 61 // Keeps track of global handles created (not JS wrappers | 260 // Keeps track of global handles created (not JS wrappers |
| 62 // of DOM objects). Often these global handles are source | 261 // of DOM objects). Often these global handles are source |
| 63 // of leaks. | 262 // of leaks. |
| 64 // | 263 // |
| 65 // If you want to let a C++ object hold a persistent handle | 264 // If you want to let a C++ object hold a persistent handle |
| 66 // to a JS object, you should register the handle here to | 265 // to a JS object, you should register the handle here to |
| 67 // keep track of leaks. | 266 // keep track of leaks. |
| 68 // | 267 // |
| 69 // When creating a persistent handle, call: | 268 // When creating a persistent handle, call: |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 { | 378 { |
| 180 for (DOMNodeMap::iterator it = node_map.begin(), end = node_map.end(); | 379 for (DOMNodeMap::iterator it = node_map.begin(), end = node_map.end(); |
| 181 it != end; ++it) { | 380 it != end; ++it) { |
| 182 Node* node = it->first; | 381 Node* node = it->first; |
| 183 USE_VAR(node); | 382 USE_VAR(node); |
| 184 ASSERT(v8::Persistent<v8::Object>(it->second).IsWeak()); | 383 ASSERT(v8::Persistent<v8::Object>(it->second).IsWeak()); |
| 185 } | 384 } |
| 186 } | 385 } |
| 187 #endif // NDEBUG | 386 #endif // NDEBUG |
| 188 | 387 |
| 388 static void WeakDOMObjectCallback(v8::Persistent<v8::Value> obj, void* para); |
| 389 static void WeakActiveDOMObjectCallback(v8::Persistent<v8::Value> obj, |
| 390 void* para); |
| 391 static void WeakNodeCallback(v8::Persistent<v8::Value> obj, void* para); |
| 392 // A map from DOM node to its JS wrapper. |
| 393 static DOMWrapperMap<Node>& GetDOMNodeMap() |
| 394 { |
| 395 static DOMWrapperMap<Node> static_dom_node_map(&WeakNodeCallback); |
| 396 return static_dom_node_map; |
| 397 } |
| 398 |
| 399 |
| 400 // A map from a DOM object (non-node) to its JS wrapper. This map does not |
| 401 // contain the DOM objects which can have pending activity (active dom objects). |
| 402 DOMWrapperMap<void>& GetDOMObjectMap() |
| 403 { |
| 404 static DOMWrapperMap<void> |
| 405 static_dom_object_map(&WeakDOMObjectCallback); |
| 406 return static_dom_object_map; |
| 407 } |
| 408 |
| 409 |
| 410 // A map from a DOM object to its JS wrapper for DOM objects which |
| 411 // can have pending activity. |
| 412 static DOMWrapperMap<void>& GetActiveDOMObjectMap() |
| 413 { |
| 414 static DOMWrapperMap<void> |
| 415 static_active_dom_object_map(&WeakActiveDOMObjectCallback); |
| 416 return static_active_dom_object_map; |
| 417 } |
| 418 |
| 189 #if ENABLE(SVG) | 419 #if ENABLE(SVG) |
| 420 static void WeakSVGElementInstanceCallback(v8::Persistent<v8::Value> obj, |
| 421 void* param); |
| 422 |
| 423 // A map for SVGElementInstances. |
| 424 static DOMWrapperMap<SVGElementInstance>& dom_svg_element_instance_map() |
| 425 { |
| 426 static DOMWrapperMap<SVGElementInstance> |
| 427 static_dom_svg_element_instance_map(&WeakSVGElementInstanceCallback); |
| 428 return static_dom_svg_element_instance_map; |
| 429 } |
| 430 |
| 431 static void WeakSVGElementInstanceCallback(v8::Persistent<v8::Value> obj, |
| 432 void* param) |
| 433 { |
| 434 SVGElementInstance* instance = static_cast<SVGElementInstance*>(param); |
| 435 ASSERT(dom_svg_element_instance_map().contains(instance)); |
| 436 |
| 437 instance->deref(); |
| 438 dom_svg_element_instance_map().forget(instance); |
| 439 } |
| 440 |
| 190 v8::Handle<v8::Value> V8Proxy::SVGElementInstanceToV8Object( | 441 v8::Handle<v8::Value> V8Proxy::SVGElementInstanceToV8Object( |
| 191 SVGElementInstance* instance) | 442 SVGElementInstance* instance) |
| 192 { | 443 { |
| 193 if (!instance) | 444 if (!instance) |
| 194 return v8::Null(); | 445 return v8::Null(); |
| 195 | 446 |
| 196 v8::Handle<v8::Object> existing_instance = getDOMSVGElementInstanceMap().get(i
nstance); | 447 v8::Handle<v8::Object> existing_instance = dom_svg_element_instance_map().get(
instance); |
| 197 if (!existing_instance.IsEmpty()) | 448 if (!existing_instance.IsEmpty()) |
| 198 return existing_instance; | 449 return existing_instance; |
| 199 | 450 |
| 200 instance->ref(); | 451 instance->ref(); |
| 201 | 452 |
| 202 // Instantiate the V8 object and remember it | 453 // Instantiate the V8 object and remember it |
| 203 v8::Handle<v8::Object> result = | 454 v8::Handle<v8::Object> result = |
| 204 InstantiateV8Object(V8ClassIndex::SVGELEMENTINSTANCE, | 455 InstantiateV8Object(V8ClassIndex::SVGELEMENTINSTANCE, |
| 205 V8ClassIndex::SVGELEMENTINSTANCE, | 456 V8ClassIndex::SVGELEMENTINSTANCE, |
| 206 instance); | 457 instance); |
| 207 if (!result.IsEmpty()) { | 458 if (!result.IsEmpty()) { |
| 208 // Only update the DOM SVG element map if the result is non-empty. | 459 // Only update the DOM SVG element map if the result is non-empty. |
| 209 getDOMSVGElementInstanceMap().set(instance, | 460 dom_svg_element_instance_map().set(instance, |
| 210 v8::Persistent<v8::Object>::New(result)); | 461 v8::Persistent<v8::Object>::New(result)); |
| 211 } | 462 } |
| 212 return result; | 463 return result; |
| 213 } | 464 } |
| 214 | 465 |
| 466 |
| 467 // SVG non-node elements may have a reference to a context node which |
| 468 // should be notified when the element is change |
| 469 static void WeakSVGObjectWithContext(v8::Persistent<v8::Value> obj, |
| 470 void* dom_obj); |
| 471 |
| 472 // Map of SVG objects with contexts to V8 objects |
| 473 static DOMWrapperMap<void>& dom_svg_object_with_context_map() { |
| 474 static DOMWrapperMap<void> |
| 475 static_dom_svg_object_with_context_map(&WeakSVGObjectWithContext); |
| 476 return static_dom_svg_object_with_context_map; |
| 477 } |
| 478 |
| 479 // Map of SVG objects with contexts to their contexts |
| 480 static HashMap<void*, SVGElement*>& svg_object_to_context_map() |
| 481 { |
| 482 static HashMap<void*, SVGElement*> static_svg_object_to_context_map; |
| 483 return static_svg_object_to_context_map; |
| 484 } |
| 485 |
| 215 v8::Handle<v8::Value> V8Proxy::SVGObjectWithContextToV8Object( | 486 v8::Handle<v8::Value> V8Proxy::SVGObjectWithContextToV8Object( |
| 216 V8ClassIndex::V8WrapperType type, void* object) | 487 V8ClassIndex::V8WrapperType type, void* object) |
| 217 { | 488 { |
| 218 if (!object) | 489 if (!object) |
| 219 return v8::Null(); | 490 return v8::Null(); |
| 220 | 491 |
| 221 v8::Persistent<v8::Object> result = | 492 v8::Persistent<v8::Object> result = |
| 222 getDOMSVGObjectWithContextMap().get(object); | 493 dom_svg_object_with_context_map().get(object); |
| 223 if (!result.IsEmpty()) return result; | 494 if (!result.IsEmpty()) return result; |
| 224 | 495 |
| 225 // Special case: SVGPathSegs need to be downcast to their real type | 496 // Special case: SVGPathSegs need to be downcast to their real type |
| 226 if (type == V8ClassIndex::SVGPATHSEG) | 497 if (type == V8ClassIndex::SVGPATHSEG) |
| 227 type = V8Custom::DowncastSVGPathSeg(object); | 498 type = V8Custom::DowncastSVGPathSeg(object); |
| 228 | 499 |
| 229 v8::Local<v8::Object> v8obj = InstantiateV8Object(type, type, object); | 500 v8::Local<v8::Object> v8obj = InstantiateV8Object(type, type, object); |
| 230 if (!v8obj.IsEmpty()) { | 501 if (!v8obj.IsEmpty()) { |
| 231 result = v8::Persistent<v8::Object>::New(v8obj); | 502 result = v8::Persistent<v8::Object>::New(v8obj); |
| 232 switch (type) { | 503 switch (type) { |
| 233 #define MAKE_CASE(TYPE, NAME) \ | 504 #define MAKE_CASE(TYPE, NAME) \ |
| 234 case V8ClassIndex::TYPE: static_cast<NAME*>(object)->ref(); break; | 505 case V8ClassIndex::TYPE: static_cast<NAME*>(object)->ref(); break; |
| 235 SVG_OBJECT_TYPES(MAKE_CASE) | 506 SVG_OBJECT_TYPES(MAKE_CASE) |
| 236 #undef MAKE_CASE | 507 #undef MAKE_CASE |
| 237 #define MAKE_CASE(TYPE, NAME) \ | 508 #define MAKE_CASE(TYPE, NAME) \ |
| 238 case V8ClassIndex::TYPE: \ | 509 case V8ClassIndex::TYPE: \ |
| 239 static_cast<V8SVGPODTypeWrapper<NAME>*>(object)->ref(); break; | 510 static_cast<V8SVGPODTypeWrapper<NAME>*>(object)->ref(); break; |
| 240 SVG_POD_NATIVE_TYPES(MAKE_CASE) | 511 SVG_POD_NATIVE_TYPES(MAKE_CASE) |
| 241 #undef MAKE_CASE | 512 #undef MAKE_CASE |
| 242 default: | 513 default: |
| 243 ASSERT(false); | 514 ASSERT(false); |
| 244 } | 515 } |
| 245 getDOMSVGObjectWithContextMap().set(object, result); | 516 dom_svg_object_with_context_map().set(object, result); |
| 246 } | 517 } |
| 247 | 518 |
| 248 return result; | 519 return result; |
| 249 } | 520 } |
| 250 | 521 |
| 251 // Map of SVG objects with contexts to their contexts | 522 static void WeakSVGObjectWithContext(v8::Persistent<v8::Value> obj, |
| 252 static HashMap<void*, SVGElement*>& svg_object_to_context_map() { | 523 void* dom_obj) |
| 253 static HashMap<void*, SVGElement*> static_svg_object_to_context_map; | 524 { |
| 254 return static_svg_object_to_context_map; | 525 v8::HandleScope handle_scope; |
| 526 ASSERT(dom_svg_object_with_context_map().contains(dom_obj)); |
| 527 ASSERT(obj->IsObject()); |
| 528 |
| 529 // Forget function removes object from the map and dispose the wrapper. |
| 530 dom_svg_object_with_context_map().forget(dom_obj); |
| 531 |
| 532 V8ClassIndex::V8WrapperType type = |
| 533 V8Proxy::GetDOMWrapperType(v8::Handle<v8::Object>::Cast(obj)); |
| 534 |
| 535 switch (type) { |
| 536 #define MAKE_CASE(TYPE, NAME) \ |
| 537 case V8ClassIndex::TYPE: static_cast<NAME*>(dom_obj)->deref(); break; |
| 538 SVG_OBJECT_TYPES(MAKE_CASE) |
| 539 #undef MAKE_CASE |
| 540 #define MAKE_CASE(TYPE, NAME) \ |
| 541 case V8ClassIndex::TYPE: \ |
| 542 static_cast<V8SVGPODTypeWrapper<NAME>*>(dom_obj)->deref(); break; |
| 543 SVG_POD_NATIVE_TYPES(MAKE_CASE) |
| 544 #undef MAKE_CASE |
| 545 default: |
| 546 ASSERT(false); |
| 547 } |
| 255 } | 548 } |
| 256 | 549 |
| 257 void V8Proxy::SetSVGContext(void* obj, SVGElement* context) | 550 void V8Proxy::SetSVGContext(void* obj, SVGElement* context) |
| 258 { | 551 { |
| 259 SVGElement* old_context = svg_object_to_context_map().get(obj); | 552 SVGElement* old_context = svg_object_to_context_map().get(obj); |
| 260 | 553 |
| 261 if (old_context == context) | 554 if (old_context == context) |
| 262 return; | 555 return; |
| 263 | 556 |
| 264 if (old_context) | 557 if (old_context) |
| 265 old_context->deref(); | 558 old_context->deref(); |
| 266 | 559 |
| 267 if (context) | 560 if (context) |
| 268 context->ref(); | 561 context->ref(); |
| 269 | 562 |
| 270 svg_object_to_context_map().set(obj, context); | 563 svg_object_to_context_map().set(obj, context); |
| 271 } | 564 } |
| 272 | 565 |
| 273 SVGElement* V8Proxy::GetSVGContext(void* obj) | 566 SVGElement* V8Proxy::GetSVGContext(void* obj) |
| 274 { | 567 { |
| 275 return svg_object_to_context_map().get(obj); | 568 return svg_object_to_context_map().get(obj); |
| 276 } | 569 } |
| 570 |
| 277 #endif | 571 #endif |
| 278 | 572 |
| 573 // Called when obj is near death (not reachable from JS roots) |
| 574 // It is time to remove the entry from the table and dispose |
| 575 // the handle. |
| 576 static void WeakDOMObjectCallback(v8::Persistent<v8::Value> obj, |
| 577 void* dom_obj) { |
| 578 v8::HandleScope scope; |
| 579 ASSERT(GetDOMObjectMap().contains(dom_obj)); |
| 580 ASSERT(obj->IsObject()); |
| 581 |
| 582 // Forget function removes object from the map and dispose the wrapper. |
| 583 GetDOMObjectMap().forget(dom_obj); |
| 584 |
| 585 V8ClassIndex::V8WrapperType type = |
| 586 V8Proxy::GetDOMWrapperType(v8::Handle<v8::Object>::Cast(obj)); |
| 587 switch (type) { |
| 588 #define MAKE_CASE(TYPE, NAME) \ |
| 589 case V8ClassIndex::TYPE: static_cast<NAME*>(dom_obj)->deref(); break; |
| 590 DOM_OBJECT_TYPES(MAKE_CASE) |
| 591 #undef MAKE_CASE |
| 592 default: |
| 593 ASSERT(false); |
| 594 } |
| 595 } |
| 596 |
| 597 |
| 598 static void WeakActiveDOMObjectCallback(v8::Persistent<v8::Value> obj, |
| 599 void* dom_obj) |
| 600 { |
| 601 v8::HandleScope scope; |
| 602 ASSERT(GetActiveDOMObjectMap().contains(dom_obj)); |
| 603 ASSERT(obj->IsObject()); |
| 604 |
| 605 // Forget function removes object from the map and dispose the wrapper. |
| 606 GetActiveDOMObjectMap().forget(dom_obj); |
| 607 |
| 608 V8ClassIndex::V8WrapperType type = |
| 609 V8Proxy::GetDOMWrapperType(v8::Handle<v8::Object>::Cast(obj)); |
| 610 switch (type) { |
| 611 #define MAKE_CASE(TYPE, NAME) \ |
| 612 case V8ClassIndex::TYPE: static_cast<NAME*>(dom_obj)->deref(); break; |
| 613 ACTIVE_DOM_OBJECT_TYPES(MAKE_CASE) |
| 614 #undef MAKE_CASE |
| 615 default: |
| 616 ASSERT(false); |
| 617 } |
| 618 } |
| 619 |
| 620 static void WeakNodeCallback(v8::Persistent<v8::Value> obj, void* param) |
| 621 { |
| 622 Node* node = static_cast<Node*>(param); |
| 623 ASSERT(GetDOMNodeMap().contains(node)); |
| 624 |
| 625 GetDOMNodeMap().forget(node); |
| 626 node->deref(); |
| 627 } |
| 628 |
| 629 |
| 279 // A map from a DOM node to its JS wrapper, the wrapper | 630 // A map from a DOM node to its JS wrapper, the wrapper |
| 280 // is kept as a strong reference to survive GCs. | 631 // is kept as a strong reference to survive GCs. |
| 281 static DOMObjectMap& gc_protected_map() { | 632 static DOMObjectMap& gc_protected_map() { |
| 282 static DOMObjectMap static_gc_protected_map; | 633 static DOMObjectMap static_gc_protected_map; |
| 283 return static_gc_protected_map; | 634 return static_gc_protected_map; |
| 284 } | 635 } |
| 285 | 636 |
| 286 // static | 637 // static |
| 287 void V8Proxy::GCProtect(void* dom_object) | 638 void V8Proxy::GCProtect(void* dom_object) |
| 288 { | 639 { |
| 289 if (!dom_object) | 640 if (!dom_object) |
| 290 return; | 641 return; |
| 291 if (gc_protected_map().contains(dom_object)) | 642 if (gc_protected_map().contains(dom_object)) |
| 292 return; | 643 return; |
| 293 if (!getDOMObjectMap().contains(dom_object)) | 644 if (!GetDOMObjectMap().contains(dom_object)) |
| 294 return; | 645 return; |
| 295 | 646 |
| 296 // Create a new (strong) persistent handle for the object. | 647 // Create a new (strong) persistent handle for the object. |
| 297 v8::Persistent<v8::Object> wrapper = getDOMObjectMap().get(dom_object); | 648 v8::Persistent<v8::Object> wrapper = GetDOMObjectMap().get(dom_object); |
| 298 if (wrapper.IsEmpty()) return; | 649 if (wrapper.IsEmpty()) return; |
| 299 | 650 |
| 300 gc_protected_map().set(dom_object, *v8::Persistent<v8::Object>::New(wrapper)); | 651 gc_protected_map().set(dom_object, *v8::Persistent<v8::Object>::New(wrapper)); |
| 301 } | 652 } |
| 302 | 653 |
| 303 | 654 |
| 304 // static | 655 // static |
| 305 void V8Proxy::GCUnprotect(void* dom_object) | 656 void V8Proxy::GCUnprotect(void* dom_object) |
| 306 { | 657 { |
| 307 if (!dom_object) | 658 if (!dom_object) |
| 308 return; | 659 return; |
| 309 if (!gc_protected_map().contains(dom_object)) | 660 if (!gc_protected_map().contains(dom_object)) |
| 310 return; | 661 return; |
| 311 | 662 |
| 312 // Dispose the strong reference. | 663 // Dispose the strong reference. |
| 313 v8::Persistent<v8::Object> wrapper(gc_protected_map().take(dom_object)); | 664 v8::Persistent<v8::Object> wrapper(gc_protected_map().take(dom_object)); |
| 314 wrapper.Dispose(); | 665 wrapper.Dispose(); |
| 315 } | 666 } |
| 316 | 667 |
| 317 | 668 |
| 318 // Create object groups for DOM tree nodes. | 669 // Create object groups for DOM tree nodes. |
| 319 static void GCPrologue() | 670 static void GCPrologue() |
| 320 { | 671 { |
| 321 v8::HandleScope scope; | 672 v8::HandleScope scope; |
| 322 | 673 |
| 323 #ifndef NDEBUG | 674 #ifndef NDEBUG |
| 324 EnumerateDOMObjectMap(getDOMObjectMap().impl()); | 675 EnumerateDOMObjectMap(GetDOMObjectMap().impl()); |
| 325 #endif | 676 #endif |
| 326 | 677 |
| 327 // Run through all objects with possible pending activity making their | 678 // Run through all objects with possible pending activity making their |
| 328 // wrappers non weak if there is pending activity. | 679 // wrappers non weak if there is pending activity. |
| 329 DOMObjectMap active_map = getActiveDOMObjectMap().impl(); | 680 DOMObjectMap active_map = GetActiveDOMObjectMap().impl(); |
| 330 for (DOMObjectMap::iterator it = active_map.begin(), end = active_map.end(); | 681 for (DOMObjectMap::iterator it = active_map.begin(), end = active_map.end(); |
| 331 it != end; ++it) { | 682 it != end; ++it) { |
| 332 void* obj = it->first; | 683 void* obj = it->first; |
| 333 v8::Persistent<v8::Object> wrapper = v8::Persistent<v8::Object>(it->second); | 684 v8::Persistent<v8::Object> wrapper = v8::Persistent<v8::Object>(it->second); |
| 334 ASSERT(wrapper.IsWeak()); | 685 ASSERT(wrapper.IsWeak()); |
| 335 V8ClassIndex::V8WrapperType type = V8Proxy::GetDOMWrapperType(wrapper); | 686 V8ClassIndex::V8WrapperType type = V8Proxy::GetDOMWrapperType(wrapper); |
| 336 switch (type) { | 687 switch (type) { |
| 337 #define MAKE_CASE(TYPE, NAME) \ | 688 #define MAKE_CASE(TYPE, NAME) \ |
| 338 case V8ClassIndex::TYPE: { \ | 689 case V8ClassIndex::TYPE: { \ |
| 339 NAME* impl = static_cast<NAME*>(obj); \ | 690 NAME* impl = static_cast<NAME*>(obj); \ |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 V8Custom::kMessagePortEntangledPortIndex, v8::Undefined()); | 733 V8Custom::kMessagePortEntangledPortIndex, v8::Undefined()); |
| 383 } | 734 } |
| 384 } | 735 } |
| 385 } | 736 } |
| 386 } | 737 } |
| 387 | 738 |
| 388 // Create object groups. | 739 // Create object groups. |
| 389 typedef std::pair<uintptr_t, Node*> GrouperPair; | 740 typedef std::pair<uintptr_t, Node*> GrouperPair; |
| 390 typedef Vector<GrouperPair> GrouperList; | 741 typedef Vector<GrouperPair> GrouperList; |
| 391 | 742 |
| 392 DOMNodeMap node_map = getDOMNodeMap().impl(); | 743 DOMNodeMap node_map = GetDOMNodeMap().impl(); |
| 393 GrouperList grouper; | 744 GrouperList grouper; |
| 394 grouper.reserveCapacity(node_map.size()); | 745 grouper.reserveCapacity(node_map.size()); |
| 395 | 746 |
| 396 for (DOMNodeMap::iterator it = node_map.begin(), end = node_map.end(); | 747 for (DOMNodeMap::iterator it = node_map.begin(), end = node_map.end(); |
| 397 it != end; ++it) { | 748 it != end; ++it) { |
| 398 Node* node = it->first; | 749 Node* node = it->first; |
| 399 | 750 |
| 400 // If the node is in document, put it in the ownerDocument's object group. | 751 // If the node is in document, put it in the ownerDocument's object group. |
| 401 // | 752 // |
| 402 // If an image element was created by JavaScript "new Image", | 753 // If an image element was created by JavaScript "new Image", |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 // has one object, it has nothing else that needs to be kept alive. | 799 // has one object, it has nothing else that needs to be kept alive. |
| 449 if (next_key_index - i <= 1) { | 800 if (next_key_index - i <= 1) { |
| 450 i = next_key_index; | 801 i = next_key_index; |
| 451 continue; | 802 continue; |
| 452 } | 803 } |
| 453 | 804 |
| 454 Vector<v8::Persistent<v8::Value> > group; | 805 Vector<v8::Persistent<v8::Value> > group; |
| 455 group.reserveCapacity(next_key_index - i); | 806 group.reserveCapacity(next_key_index - i); |
| 456 for (; i < next_key_index; ++i) { | 807 for (; i < next_key_index; ++i) { |
| 457 v8::Persistent<v8::Value> wrapper = | 808 v8::Persistent<v8::Value> wrapper = |
| 458 getDOMNodeMap().get(grouper[i].second); | 809 GetDOMNodeMap().get(grouper[i].second); |
| 459 if (!wrapper.IsEmpty()) | 810 if (!wrapper.IsEmpty()) |
| 460 group.append(wrapper); | 811 group.append(wrapper); |
| 461 } | 812 } |
| 462 | 813 |
| 463 if (group.size() > 1) | 814 if (group.size() > 1) |
| 464 v8::V8::AddObjectGroup(&group[0], group.size()); | 815 v8::V8::AddObjectGroup(&group[0], group.size()); |
| 465 | 816 |
| 466 ASSERT(i == next_key_index); | 817 ASSERT(i == next_key_index); |
| 467 } | 818 } |
| 468 } | 819 } |
| 469 | 820 |
| 470 | 821 |
| 471 static void GCEpilogue() | 822 static void GCEpilogue() |
| 472 { | 823 { |
| 473 v8::HandleScope scope; | 824 v8::HandleScope scope; |
| 474 | 825 |
| 475 // Run through all objects with pending activity making their wrappers weak | 826 // Run through all objects with pending activity making their wrappers weak |
| 476 // again. | 827 // again. |
| 477 DOMObjectMap active_map = getActiveDOMObjectMap().impl(); | 828 DOMObjectMap active_map = GetActiveDOMObjectMap().impl(); |
| 478 for (DOMObjectMap::iterator it = active_map.begin(), end = active_map.end(); | 829 for (DOMObjectMap::iterator it = active_map.begin(), end = active_map.end(); |
| 479 it != end; ++it) { | 830 it != end; ++it) { |
| 480 void* obj = it->first; | 831 void* obj = it->first; |
| 481 v8::Persistent<v8::Object> wrapper = v8::Persistent<v8::Object>(it->second); | 832 v8::Persistent<v8::Object> wrapper = v8::Persistent<v8::Object>(it->second); |
| 482 V8ClassIndex::V8WrapperType type = V8Proxy::GetDOMWrapperType(wrapper); | 833 V8ClassIndex::V8WrapperType type = V8Proxy::GetDOMWrapperType(wrapper); |
| 483 switch (type) { | 834 switch (type) { |
| 484 #define MAKE_CASE(TYPE, NAME) \ | 835 #define MAKE_CASE(TYPE, NAME) \ |
| 485 case V8ClassIndex::TYPE: { \ | 836 case V8ClassIndex::TYPE: { \ |
| 486 NAME* impl = static_cast<NAME*>(obj); \ | 837 NAME* impl = static_cast<NAME*>(obj); \ |
| 487 if (impl->hasPendingActivity()) { \ | 838 if (impl->hasPendingActivity()) { \ |
| 488 ASSERT(!wrapper.IsWeak()); \ | 839 ASSERT(!wrapper.IsWeak()); \ |
| 489 wrapper.MakeWeak(impl, &weakActiveDOMObjectCallback); \ | 840 wrapper.MakeWeak(impl, &WeakActiveDOMObjectCallback); \ |
| 490 } \ | 841 } \ |
| 491 break; \ | 842 break; \ |
| 492 } | 843 } |
| 493 ACTIVE_DOM_OBJECT_TYPES(MAKE_CASE) | 844 ACTIVE_DOM_OBJECT_TYPES(MAKE_CASE) |
| 494 default: | 845 default: |
| 495 ASSERT(false); | 846 ASSERT(false); |
| 496 #undef MAKE_CASE | 847 #undef MAKE_CASE |
| 497 } | 848 } |
| 498 } | 849 } |
| 499 | 850 |
| 500 #ifndef NDEBUG | 851 #ifndef NDEBUG |
| 501 // Check all survivals are weak. | 852 // Check all survivals are weak. |
| 502 EnumerateDOMObjectMap(getDOMObjectMap().impl()); | 853 EnumerateDOMObjectMap(GetDOMObjectMap().impl()); |
| 503 EnumerateDOMNodeMap(getDOMNodeMap().impl()); | 854 EnumerateDOMNodeMap(GetDOMNodeMap().impl()); |
| 504 EnumerateDOMObjectMap(gc_protected_map()); | 855 EnumerateDOMObjectMap(gc_protected_map()); |
| 505 EnumerateGlobalHandles(); | 856 EnumerateGlobalHandles(); |
| 506 #undef USE_VAR | 857 #undef USE_VAR |
| 507 #endif | 858 #endif |
| 508 } | 859 } |
| 509 | 860 |
| 510 | 861 |
| 511 typedef HashMap<int, v8::FunctionTemplate*> FunctionTemplateMap; | 862 typedef HashMap<int, v8::FunctionTemplate*> FunctionTemplateMap; |
| 512 | 863 |
| 513 bool AllowAllocation::m_current = false; | 864 bool AllowAllocation::m_current = false; |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 755 #ifndef NDEBUG | 1106 #ifndef NDEBUG |
| 756 UnregisterGlobalHandle(this, m_global); | 1107 UnregisterGlobalHandle(this, m_global); |
| 757 #endif | 1108 #endif |
| 758 m_global.Dispose(); | 1109 m_global.Dispose(); |
| 759 m_global.Clear(); | 1110 m_global.Clear(); |
| 760 } | 1111 } |
| 761 } | 1112 } |
| 762 | 1113 |
| 763 | 1114 |
| 764 bool V8Proxy::DOMObjectHasJSWrapper(void* obj) { | 1115 bool V8Proxy::DOMObjectHasJSWrapper(void* obj) { |
| 765 return getDOMObjectMap().contains(obj) || | 1116 return GetDOMObjectMap().contains(obj) || |
| 766 getActiveDOMObjectMap().contains(obj); | 1117 GetActiveDOMObjectMap().contains(obj); |
| 767 } | 1118 } |
| 768 | 1119 |
| 769 | 1120 |
| 770 // The caller must have increased obj's ref count. | 1121 // The caller must have increased obj's ref count. |
| 771 void V8Proxy::SetJSWrapperForDOMObject(void* obj, v8::Persistent<v8::Object> wra
pper) | 1122 void V8Proxy::SetJSWrapperForDOMObject(void* obj, v8::Persistent<v8::Object> wra
pper) |
| 772 { | 1123 { |
| 773 ASSERT(MaybeDOMWrapper(wrapper)); | 1124 ASSERT(MaybeDOMWrapper(wrapper)); |
| 774 #ifndef NDEBUG | 1125 #ifndef NDEBUG |
| 775 V8ClassIndex::V8WrapperType type = V8Proxy::GetDOMWrapperType(wrapper); | 1126 V8ClassIndex::V8WrapperType type = V8Proxy::GetDOMWrapperType(wrapper); |
| 776 switch (type) { | 1127 switch (type) { |
| 777 #define MAKE_CASE(TYPE, NAME) case V8ClassIndex::TYPE: | 1128 #define MAKE_CASE(TYPE, NAME) case V8ClassIndex::TYPE: |
| 778 ACTIVE_DOM_OBJECT_TYPES(MAKE_CASE) | 1129 ACTIVE_DOM_OBJECT_TYPES(MAKE_CASE) |
| 779 ASSERT(false); | 1130 ASSERT(false); |
| 780 #undef MAKE_CASE | 1131 #undef MAKE_CASE |
| 781 default: break; | 1132 default: break; |
| 782 } | 1133 } |
| 783 #endif | 1134 #endif |
| 784 getDOMObjectMap().set(obj, wrapper); | 1135 GetDOMObjectMap().set(obj, wrapper); |
| 785 } | 1136 } |
| 786 | 1137 |
| 787 // The caller must have increased obj's ref count. | 1138 // The caller must have increased obj's ref count. |
| 788 void V8Proxy::SetJSWrapperForActiveDOMObject(void* obj, v8::Persistent<v8::Objec
t> wrapper) | 1139 void V8Proxy::SetJSWrapperForActiveDOMObject(void* obj, v8::Persistent<v8::Objec
t> wrapper) |
| 789 { | 1140 { |
| 790 ASSERT(MaybeDOMWrapper(wrapper)); | 1141 ASSERT(MaybeDOMWrapper(wrapper)); |
| 791 #ifndef NDEBUG | 1142 #ifndef NDEBUG |
| 792 V8ClassIndex::V8WrapperType type = V8Proxy::GetDOMWrapperType(wrapper); | 1143 V8ClassIndex::V8WrapperType type = V8Proxy::GetDOMWrapperType(wrapper); |
| 793 switch (type) { | 1144 switch (type) { |
| 794 #define MAKE_CASE(TYPE, NAME) case V8ClassIndex::TYPE: break; | 1145 #define MAKE_CASE(TYPE, NAME) case V8ClassIndex::TYPE: break; |
| 795 ACTIVE_DOM_OBJECT_TYPES(MAKE_CASE) | 1146 ACTIVE_DOM_OBJECT_TYPES(MAKE_CASE) |
| 796 default: ASSERT(false); | 1147 default: ASSERT(false); |
| 797 #undef MAKE_CASE | 1148 #undef MAKE_CASE |
| 798 } | 1149 } |
| 799 #endif | 1150 #endif |
| 800 getActiveDOMObjectMap().set(obj, wrapper); | 1151 GetActiveDOMObjectMap().set(obj, wrapper); |
| 801 } | 1152 } |
| 802 | 1153 |
| 803 // The caller must have increased node's ref count. | 1154 // The caller must have increased node's ref count. |
| 804 void V8Proxy::SetJSWrapperForDOMNode(Node* node, v8::Persistent<v8::Object> wrap
per) | 1155 void V8Proxy::SetJSWrapperForDOMNode(Node* node, v8::Persistent<v8::Object> wrap
per) |
| 805 { | 1156 { |
| 806 ASSERT(MaybeDOMWrapper(wrapper)); | 1157 ASSERT(MaybeDOMWrapper(wrapper)); |
| 807 getDOMNodeMap().set(node, wrapper); | 1158 GetDOMNodeMap().set(node, wrapper); |
| 808 } | 1159 } |
| 809 | 1160 |
| 810 PassRefPtr<EventListener> V8Proxy::createInlineEventListener( | 1161 PassRefPtr<EventListener> V8Proxy::createInlineEventListener( |
| 811 const String& functionName, | 1162 const String& functionName, |
| 812 const String& code, Node* node) | 1163 const String& code, Node* node) |
| 813 { | 1164 { |
| 814 return V8LazyEventListener::create(m_frame, code, functionName); | 1165 return V8LazyEventListener::create(m_frame, code, functionName); |
| 815 } | 1166 } |
| 816 | 1167 |
| 817 #if ENABLE(SVG) | 1168 #if ENABLE(SVG) |
| (...skipping 1456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2274 default: | 2625 default: |
| 2275 break; | 2626 break; |
| 2276 } | 2627 } |
| 2277 | 2628 |
| 2278 #undef MAKE_CASE | 2629 #undef MAKE_CASE |
| 2279 | 2630 |
| 2280 if (!imp) return v8::Null(); | 2631 if (!imp) return v8::Null(); |
| 2281 | 2632 |
| 2282 // Non DOM node | 2633 // Non DOM node |
| 2283 v8::Persistent<v8::Object> result = is_active_dom_object ? | 2634 v8::Persistent<v8::Object> result = is_active_dom_object ? |
| 2284 getActiveDOMObjectMap().get(imp) : | 2635 GetActiveDOMObjectMap().get(imp) : |
| 2285 getDOMObjectMap().get(imp); | 2636 GetDOMObjectMap().get(imp); |
| 2286 if (result.IsEmpty()) { | 2637 if (result.IsEmpty()) { |
| 2287 v8::Local<v8::Object> v8obj = InstantiateV8Object(type, type, imp); | 2638 v8::Local<v8::Object> v8obj = InstantiateV8Object(type, type, imp); |
| 2288 if (!v8obj.IsEmpty()) { | 2639 if (!v8obj.IsEmpty()) { |
| 2289 // Go through big switch statement, it has some duplications | 2640 // Go through big switch statement, it has some duplications |
| 2290 // that were handled by code above (such as CSSVALUE, CSSRULE, etc). | 2641 // that were handled by code above (such as CSSVALUE, CSSRULE, etc). |
| 2291 switch (type) { | 2642 switch (type) { |
| 2292 #define MAKE_CASE(TYPE, NAME) \ | 2643 #define MAKE_CASE(TYPE, NAME) \ |
| 2293 case V8ClassIndex::TYPE: static_cast<NAME*>(imp)->ref(); break; | 2644 case V8ClassIndex::TYPE: static_cast<NAME*>(imp)->ref(); break; |
| 2294 DOM_OBJECT_TYPES(MAKE_CASE) | 2645 DOM_OBJECT_TYPES(MAKE_CASE) |
| 2295 #undef MAKE_CASE | 2646 #undef MAKE_CASE |
| (...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2745 #undef FOR_EACH_TAG | 3096 #undef FOR_EACH_TAG |
| 2746 | 3097 |
| 2747 #endif // ENABLE(SVG) | 3098 #endif // ENABLE(SVG) |
| 2748 | 3099 |
| 2749 | 3100 |
| 2750 v8::Handle<v8::Value> V8Proxy::EventToV8Object(Event* event) | 3101 v8::Handle<v8::Value> V8Proxy::EventToV8Object(Event* event) |
| 2751 { | 3102 { |
| 2752 if (!event) | 3103 if (!event) |
| 2753 return v8::Null(); | 3104 return v8::Null(); |
| 2754 | 3105 |
| 2755 v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(event); | 3106 v8::Handle<v8::Object> wrapper = GetDOMObjectMap().get(event); |
| 2756 if (!wrapper.IsEmpty()) | 3107 if (!wrapper.IsEmpty()) |
| 2757 return wrapper; | 3108 return wrapper; |
| 2758 | 3109 |
| 2759 V8ClassIndex::V8WrapperType type = V8ClassIndex::EVENT; | 3110 V8ClassIndex::V8WrapperType type = V8ClassIndex::EVENT; |
| 2760 | 3111 |
| 2761 if (event->isUIEvent()) { | 3112 if (event->isUIEvent()) { |
| 2762 if (event->isKeyboardEvent()) | 3113 if (event->isKeyboardEvent()) |
| 2763 type = V8ClassIndex::KEYBOARDEVENT; | 3114 type = V8ClassIndex::KEYBOARDEVENT; |
| 2764 else if (event->isTextEvent()) | 3115 else if (event->isTextEvent()) |
| 2765 type = V8ClassIndex::TEXTEVENT; | 3116 type = V8ClassIndex::TEXTEVENT; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2804 | 3155 |
| 2805 return result; | 3156 return result; |
| 2806 } | 3157 } |
| 2807 | 3158 |
| 2808 | 3159 |
| 2809 // Caller checks node is not null. | 3160 // Caller checks node is not null. |
| 2810 v8::Handle<v8::Value> V8Proxy::NodeToV8Object(Node* node) | 3161 v8::Handle<v8::Value> V8Proxy::NodeToV8Object(Node* node) |
| 2811 { | 3162 { |
| 2812 if (!node) return v8::Null(); | 3163 if (!node) return v8::Null(); |
| 2813 | 3164 |
| 2814 v8::Handle<v8::Object> wrapper = getDOMNodeMap().get(node); | 3165 v8::Handle<v8::Object> wrapper = GetDOMNodeMap().get(node); |
| 2815 if (!wrapper.IsEmpty()) | 3166 if (!wrapper.IsEmpty()) |
| 2816 return wrapper; | 3167 return wrapper; |
| 2817 | 3168 |
| 2818 bool is_document = false; // document type node has special handling | 3169 bool is_document = false; // document type node has special handling |
| 2819 V8ClassIndex::V8WrapperType type; | 3170 V8ClassIndex::V8WrapperType type; |
| 2820 | 3171 |
| 2821 switch (node->nodeType()) { | 3172 switch (node->nodeType()) { |
| 2822 case Node::ELEMENT_NODE: | 3173 case Node::ELEMENT_NODE: |
| 2823 if (node->isHTMLElement()) | 3174 if (node->isHTMLElement()) |
| 2824 type = GetHTMLElementType(static_cast<HTMLElement*>(node)); | 3175 type = GetHTMLElementType(static_cast<HTMLElement*>(node)); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2950 return ToV8Object(V8ClassIndex::WORKER, worker); | 3301 return ToV8Object(V8ClassIndex::WORKER, worker); |
| 2951 #endif // WORKERS | 3302 #endif // WORKERS |
| 2952 | 3303 |
| 2953 Node* node = target->toNode(); | 3304 Node* node = target->toNode(); |
| 2954 if (node) | 3305 if (node) |
| 2955 return NodeToV8Object(node); | 3306 return NodeToV8Object(node); |
| 2956 | 3307 |
| 2957 // XMLHttpRequest is created within its JS counterpart. | 3308 // XMLHttpRequest is created within its JS counterpart. |
| 2958 XMLHttpRequest* xhr = target->toXMLHttpRequest(); | 3309 XMLHttpRequest* xhr = target->toXMLHttpRequest(); |
| 2959 if (xhr) { | 3310 if (xhr) { |
| 2960 v8::Handle<v8::Object> wrapper = getActiveDOMObjectMap().get(xhr); | 3311 v8::Handle<v8::Object> wrapper = GetActiveDOMObjectMap().get(xhr); |
| 2961 ASSERT(!wrapper.IsEmpty()); | 3312 ASSERT(!wrapper.IsEmpty()); |
| 2962 return wrapper; | 3313 return wrapper; |
| 2963 } | 3314 } |
| 2964 | 3315 |
| 2965 // MessagePort is created within its JS counterpart | 3316 // MessagePort is created within its JS counterpart |
| 2966 MessagePort* port = target->toMessagePort(); | 3317 MessagePort* port = target->toMessagePort(); |
| 2967 if (port) { | 3318 if (port) { |
| 2968 v8::Handle<v8::Object> wrapper = getActiveDOMObjectMap().get(port); | 3319 v8::Handle<v8::Object> wrapper = GetActiveDOMObjectMap().get(port); |
| 2969 ASSERT(!wrapper.IsEmpty()); | 3320 ASSERT(!wrapper.IsEmpty()); |
| 2970 return wrapper; | 3321 return wrapper; |
| 2971 } | 3322 } |
| 2972 | 3323 |
| 2973 XMLHttpRequestUpload* upload = target->toXMLHttpRequestUpload(); | 3324 XMLHttpRequestUpload* upload = target->toXMLHttpRequestUpload(); |
| 2974 if (upload) { | 3325 if (upload) { |
| 2975 v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(upload); | 3326 v8::Handle<v8::Object> wrapper = GetDOMObjectMap().get(upload); |
| 2976 ASSERT(!wrapper.IsEmpty()); | 3327 ASSERT(!wrapper.IsEmpty()); |
| 2977 return wrapper; | 3328 return wrapper; |
| 2978 } | 3329 } |
| 2979 | 3330 |
| 2980 ASSERT(0); | 3331 ASSERT(0); |
| 2981 return v8::Handle<v8::Value>(); | 3332 return v8::Handle<v8::Value>(); |
| 2982 } | 3333 } |
| 2983 | 3334 |
| 2984 | 3335 |
| 2985 v8::Handle<v8::Value> V8Proxy::EventListenerToV8Object( | 3336 v8::Handle<v8::Value> V8Proxy::EventListenerToV8Object( |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3007 return v8::Null(); | 3358 return v8::Null(); |
| 3008 } | 3359 } |
| 3009 return result; | 3360 return result; |
| 3010 } | 3361 } |
| 3011 | 3362 |
| 3012 | 3363 |
| 3013 v8::Handle<v8::Value> V8Proxy::StyleSheetToV8Object(StyleSheet* sheet) | 3364 v8::Handle<v8::Value> V8Proxy::StyleSheetToV8Object(StyleSheet* sheet) |
| 3014 { | 3365 { |
| 3015 if (!sheet) return v8::Null(); | 3366 if (!sheet) return v8::Null(); |
| 3016 | 3367 |
| 3017 v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(sheet); | 3368 v8::Handle<v8::Object> wrapper = GetDOMObjectMap().get(sheet); |
| 3018 if (!wrapper.IsEmpty()) | 3369 if (!wrapper.IsEmpty()) |
| 3019 return wrapper; | 3370 return wrapper; |
| 3020 | 3371 |
| 3021 V8ClassIndex::V8WrapperType type = V8ClassIndex::STYLESHEET; | 3372 V8ClassIndex::V8WrapperType type = V8ClassIndex::STYLESHEET; |
| 3022 if (sheet->isCSSStyleSheet()) | 3373 if (sheet->isCSSStyleSheet()) |
| 3023 type = V8ClassIndex::CSSSTYLESHEET; | 3374 type = V8ClassIndex::CSSSTYLESHEET; |
| 3024 | 3375 |
| 3025 v8::Handle<v8::Object> result = | 3376 v8::Handle<v8::Object> result = |
| 3026 InstantiateV8Object(type, V8ClassIndex::STYLESHEET, sheet); | 3377 InstantiateV8Object(type, V8ClassIndex::STYLESHEET, sheet); |
| 3027 if (!result.IsEmpty()) { | 3378 if (!result.IsEmpty()) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3039 } | 3390 } |
| 3040 | 3391 |
| 3041 return result; | 3392 return result; |
| 3042 } | 3393 } |
| 3043 | 3394 |
| 3044 | 3395 |
| 3045 v8::Handle<v8::Value> V8Proxy::CSSValueToV8Object(CSSValue* value) | 3396 v8::Handle<v8::Value> V8Proxy::CSSValueToV8Object(CSSValue* value) |
| 3046 { | 3397 { |
| 3047 if (!value) return v8::Null(); | 3398 if (!value) return v8::Null(); |
| 3048 | 3399 |
| 3049 v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(value); | 3400 v8::Handle<v8::Object> wrapper = GetDOMObjectMap().get(value); |
| 3050 if (!wrapper.IsEmpty()) | 3401 if (!wrapper.IsEmpty()) |
| 3051 return wrapper; | 3402 return wrapper; |
| 3052 | 3403 |
| 3053 V8ClassIndex::V8WrapperType type; | 3404 V8ClassIndex::V8WrapperType type; |
| 3054 | 3405 |
| 3055 if (value->isWebKitCSSTransformValue()) | 3406 if (value->isWebKitCSSTransformValue()) |
| 3056 type = V8ClassIndex::WEBKITCSSTRANSFORMVALUE; | 3407 type = V8ClassIndex::WEBKITCSSTRANSFORMVALUE; |
| 3057 else if (value->isValueList()) | 3408 else if (value->isValueList()) |
| 3058 type = V8ClassIndex::CSSVALUELIST; | 3409 type = V8ClassIndex::CSSVALUELIST; |
| 3059 else if (value->isPrimitiveValue()) | 3410 else if (value->isPrimitiveValue()) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3076 } | 3427 } |
| 3077 | 3428 |
| 3078 return result; | 3429 return result; |
| 3079 } | 3430 } |
| 3080 | 3431 |
| 3081 | 3432 |
| 3082 v8::Handle<v8::Value> V8Proxy::CSSRuleToV8Object(CSSRule* rule) | 3433 v8::Handle<v8::Value> V8Proxy::CSSRuleToV8Object(CSSRule* rule) |
| 3083 { | 3434 { |
| 3084 if (!rule) return v8::Null(); | 3435 if (!rule) return v8::Null(); |
| 3085 | 3436 |
| 3086 v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(rule); | 3437 v8::Handle<v8::Object> wrapper = GetDOMObjectMap().get(rule); |
| 3087 if (!wrapper.IsEmpty()) | 3438 if (!wrapper.IsEmpty()) |
| 3088 return wrapper; | 3439 return wrapper; |
| 3089 | 3440 |
| 3090 V8ClassIndex::V8WrapperType type; | 3441 V8ClassIndex::V8WrapperType type; |
| 3091 | 3442 |
| 3092 switch (rule->type()) { | 3443 switch (rule->type()) { |
| 3093 case CSSRule::STYLE_RULE: | 3444 case CSSRule::STYLE_RULE: |
| 3094 type = V8ClassIndex::CSSSTYLERULE; | 3445 type = V8ClassIndex::CSSSTYLERULE; |
| 3095 break; | 3446 break; |
| 3096 case CSSRule::CHARSET_RULE: | 3447 case CSSRule::CHARSET_RULE: |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3260 } | 3611 } |
| 3261 | 3612 |
| 3262 void V8Proxy::RegisterExtension(v8::Extension* extension, | 3613 void V8Proxy::RegisterExtension(v8::Extension* extension, |
| 3263 const String& schemeRestriction) { | 3614 const String& schemeRestriction) { |
| 3264 v8::RegisterExtension(extension); | 3615 v8::RegisterExtension(extension); |
| 3265 V8ExtensionInfo info = {schemeRestriction, extension}; | 3616 V8ExtensionInfo info = {schemeRestriction, extension}; |
| 3266 m_extensions.push_back(info); | 3617 m_extensions.push_back(info); |
| 3267 } | 3618 } |
| 3268 | 3619 |
| 3269 } // namespace WebCore | 3620 } // namespace WebCore |
| OLD | NEW |