Index: webkit/port/bindings/v8/v8_proxy.cpp |
=================================================================== |
--- webkit/port/bindings/v8/v8_proxy.cpp (revision 12533) |
+++ webkit/port/bindings/v8/v8_proxy.cpp (working copy) |
@@ -36,6 +36,7 @@ |
#include <v8-debug.h> |
#include "v8_proxy.h" |
+#include "dom_wrapper_map.h" |
#include "v8_index.h" |
#include "v8_binding.h" |
#include "v8_custom.h" |
@@ -44,12 +45,206 @@ |
#include "V8DOMWindow.h" |
#include "ChromiumBridge.h" |
-#include "DOMObjectsInclude.h" |
+#include "BarInfo.h" |
+#include "CanvasGradient.h" |
+#include "CanvasPattern.h" |
+#include "CanvasPixelArray.h" |
+#include "CanvasRenderingContext2D.h" |
+#include "CanvasStyle.h" |
+#include "CharacterData.h" |
+#include "ClientRect.h" |
+#include "ClientRectList.h" |
+#include "Clipboard.h" |
+#include "Console.h" |
+#include "Counter.h" |
+#include "CSSCharsetRule.h" |
+#include "CSSFontFaceRule.h" |
+#include "CSSImportRule.h" |
+#include "CSSMediaRule.h" |
+#include "CSSPageRule.h" |
+#include "CSSRule.h" |
+#include "CSSRuleList.h" |
+#include "CSSValueList.h" |
+#include "CSSStyleRule.h" |
+#include "CSSStyleSheet.h" |
+#include "CSSVariablesDeclaration.h" |
+#include "CSSVariablesRule.h" |
+#include "Database.h" |
+#include "DocumentType.h" |
+#include "DocumentFragment.h" |
+#include "DOMCoreException.h" |
+#include "DOMImplementation.h" |
+#include "DOMParser.h" |
+#include "DOMSelection.h" |
+#include "DOMStringList.h" |
+#include "DOMWindow.h" |
+#include "Entity.h" |
+#include "EventListener.h" |
+#include "EventTarget.h" |
+#include "Event.h" |
+#include "EventException.h" |
+#include "ExceptionCode.h" |
+#include "File.h" |
+#include "FileList.h" |
+#include "Frame.h" |
+#include "FrameLoader.h" |
+#include "FrameTree.h" |
+#include "History.h" |
+#include "HTMLNames.h" |
+#include "HTMLDocument.h" |
+#include "HTMLElement.h" |
+#include "HTMLImageElement.h" |
+#include "HTMLInputElement.h" |
+#include "HTMLSelectElement.h" |
+#include "HTMLOptionsCollection.h" |
+#include "ImageData.h" |
+#include "InspectorController.h" |
+#include "KeyboardEvent.h" |
+#include "Location.h" |
+#include "MediaError.h" |
+#include "MediaList.h" |
+#include "MediaPlayer.h" |
+#include "MessageChannel.h" |
+#include "MessageEvent.h" |
+#include "MessagePort.h" |
+#include "MimeTypeArray.h" |
+#include "MouseEvent.h" |
+#include "MutationEvent.h" |
+#include "Navigator.h" // for MimeTypeArray |
+#include "NodeFilter.h" |
+#include "Notation.h" |
+#include "NodeList.h" |
+#include "NodeIterator.h" |
+#include "OverflowEvent.h" |
+#include "Page.h" |
+#include "Plugin.h" |
+#include "PluginArray.h" |
+#include "ProcessingInstruction.h" |
+#include "ProgressEvent.h" |
+#include "Range.h" |
+#include "RangeException.h" |
+#include "Rect.h" |
+#include "RGBColor.h" |
+#include "Screen.h" |
+#include "ScriptExecutionContext.h" |
+#include "SecurityOrigin.h" |
+#include "Settings.h" |
+#include "SQLTransaction.h" |
+#include "SQLResultSet.h" |
+#include "SQLResultSetRowList.h" |
+#include "StyleSheet.h" |
+#include "StyleSheetList.h" |
+#include "SVGColor.h" |
+#include "SVGPaint.h" |
+#include "TextEvent.h" |
+#include "TextMetrics.h" |
+#include "TimeRanges.h" |
+#include "TreeWalker.h" |
+#include "XSLTProcessor.h" |
+#include "V8AbstractEventListener.h" |
+#include "V8CustomEventListener.h" |
+#include "V8DOMWindow.h" |
+#include "V8HTMLElement.h" |
+#include "V8LazyEventListener.h" |
+#include "V8ObjectEventListener.h" |
+#include "WebKitAnimationEvent.h" |
+#include "WebKitCSSKeyframeRule.h" |
+#include "WebKitCSSKeyframesRule.h" |
+#include "WebKitCSSMatrix.h" |
+#include "WebKitCSSTransformValue.h" |
+#include "WebKitPoint.h" |
+#include "WebKitTransitionEvent.h" |
+#include "WheelEvent.h" |
+#include "XMLHttpRequest.h" |
+#include "XMLHttpRequestException.h" |
+#include "XMLHttpRequestProgressEvent.h" |
+#include "XMLHttpRequestUpload.h" |
+#include "XMLSerializer.h" |
+#include "XPathException.h" |
+#include "XPathExpression.h" |
+#include "XPathNSResolver.h" |
+#include "XPathResult.h" |
+ |
+ |
#include "ScriptController.h" |
+#if ENABLE(SVG) |
+#include "SVGAngle.h" |
+#include "SVGAnimatedPoints.h" |
+#include "SVGElement.h" |
+#include "SVGElementInstance.h" |
+#include "SVGElementInstanceList.h" |
+#include "SVGException.h" |
+#include "SVGLength.h" |
+#include "SVGLengthList.h" |
+#include "SVGNumberList.h" |
+#include "SVGPathSeg.h" |
+#include "SVGPathSegArc.h" |
+#include "SVGPathSegClosePath.h" |
+#include "SVGPathSegCurvetoCubic.h" |
+#include "SVGPathSegCurvetoCubicSmooth.h" |
+#include "SVGPathSegCurvetoQuadratic.h" |
+#include "SVGPathSegCurvetoQuadraticSmooth.h" |
+#include "SVGPathSegLineto.h" |
+#include "SVGPathSegLinetoHorizontal.h" |
+#include "SVGPathSegLinetoVertical.h" |
+#include "SVGPathSegList.h" |
+#include "SVGPathSegMoveto.h" |
+#include "SVGPointList.h" |
+#include "SVGPreserveAspectRatio.h" |
+#include "SVGRenderingIntent.h" |
+#include "SVGStringList.h" |
+#include "SVGTransform.h" |
+#include "SVGTransformList.h" |
+#include "SVGUnitTypes.h" |
+#include "SVGURIReference.h" |
+#include "SVGZoomEvent.h" |
+#include "V8SVGPODTypeWrapper.h" |
+#endif // SVG |
+ |
+#if ENABLE(WORKERS) |
+#include "Worker.h" |
+#include "WorkerContext.h" |
+#include "WorkerLocation.h" |
+#include "WorkerNavigator.h" |
+#endif // WORKERS |
+ |
+#if ENABLE(XPATH) |
+#include "XPathEvaluator.h" |
+#endif |
+ |
+ |
namespace WebCore { |
+ |
+// DOM binding algorithm: |
+// |
+// There are two kinds of DOM objects: |
+// 1. DOM tree nodes, such as Document, HTMLElement, ... |
+// there classes implements TreeShared<T> interface; |
+// 2. Non-node DOM objects, such as CSSRule, Location, etc. |
+// these classes implement a ref-counted scheme. |
+// |
+// A DOM object may have a JS wrapper object. If a tree node |
+// is alive, its JS wrapper must be kept alive even it is not |
+// reachable from JS roots. |
+// However, JS wrappers of non-node objects can go away if |
+// not reachable from other JS objects. It works like a cache. |
+// |
+// DOM objects are ref-counted, and JS objects are traced from |
+// a set of root objects. They can create a cycle. To break |
+// cycles, we do following: |
+// Handles from DOM objects to JS wrappers are always weak, |
+// so JS wrappers of non-node object cannot create a cycle. |
+// Before starting a global GC, we create a virtual connection |
+// between nodes in the same tree in the JS heap. If the wrapper |
+// of one node in a tree is alive, wrappers of all nodes in |
+// the same tree are considered alive. This is done by creating |
+// object groups in GC prologue callbacks. The mark-compact |
+// collector will remove these groups after each GC. |
+ |
+ |
// Static utility context. |
v8::Persistent<v8::Context> V8Proxy::m_utilityContext; |
@@ -57,6 +252,10 @@ |
V8ExtensionList V8Proxy::m_extensions; |
+// A helper class for undetectable document.all |
+class UndetectableHTMLCollection : public HTMLCollection { |
+}; |
+ |
#ifndef NDEBUG |
// Keeps track of global handles created (not JS wrappers |
// of DOM objects). Often these global handles are source |
@@ -186,14 +385,66 @@ |
} |
#endif // NDEBUG |
+static void WeakDOMObjectCallback(v8::Persistent<v8::Value> obj, void* para); |
+static void WeakActiveDOMObjectCallback(v8::Persistent<v8::Value> obj, |
+ void* para); |
+static void WeakNodeCallback(v8::Persistent<v8::Value> obj, void* para); |
+// A map from DOM node to its JS wrapper. |
+static DOMWrapperMap<Node>& GetDOMNodeMap() |
+{ |
+ static DOMWrapperMap<Node> static_dom_node_map(&WeakNodeCallback); |
+ return static_dom_node_map; |
+} |
+ |
+ |
+// A map from a DOM object (non-node) to its JS wrapper. This map does not |
+// contain the DOM objects which can have pending activity (active dom objects). |
+DOMWrapperMap<void>& GetDOMObjectMap() |
+{ |
+ static DOMWrapperMap<void> |
+ static_dom_object_map(&WeakDOMObjectCallback); |
+ return static_dom_object_map; |
+} |
+ |
+ |
+// A map from a DOM object to its JS wrapper for DOM objects which |
+// can have pending activity. |
+static DOMWrapperMap<void>& GetActiveDOMObjectMap() |
+{ |
+ static DOMWrapperMap<void> |
+ static_active_dom_object_map(&WeakActiveDOMObjectCallback); |
+ return static_active_dom_object_map; |
+} |
+ |
#if ENABLE(SVG) |
+static void WeakSVGElementInstanceCallback(v8::Persistent<v8::Value> obj, |
+ void* param); |
+ |
+// A map for SVGElementInstances. |
+static DOMWrapperMap<SVGElementInstance>& dom_svg_element_instance_map() |
+{ |
+ static DOMWrapperMap<SVGElementInstance> |
+ static_dom_svg_element_instance_map(&WeakSVGElementInstanceCallback); |
+ return static_dom_svg_element_instance_map; |
+} |
+ |
+static void WeakSVGElementInstanceCallback(v8::Persistent<v8::Value> obj, |
+ void* param) |
+{ |
+ SVGElementInstance* instance = static_cast<SVGElementInstance*>(param); |
+ ASSERT(dom_svg_element_instance_map().contains(instance)); |
+ |
+ instance->deref(); |
+ dom_svg_element_instance_map().forget(instance); |
+} |
+ |
v8::Handle<v8::Value> V8Proxy::SVGElementInstanceToV8Object( |
SVGElementInstance* instance) |
{ |
if (!instance) |
return v8::Null(); |
- v8::Handle<v8::Object> existing_instance = getDOMSVGElementInstanceMap().get(instance); |
+ v8::Handle<v8::Object> existing_instance = dom_svg_element_instance_map().get(instance); |
if (!existing_instance.IsEmpty()) |
return existing_instance; |
@@ -206,12 +457,32 @@ |
instance); |
if (!result.IsEmpty()) { |
// Only update the DOM SVG element map if the result is non-empty. |
- getDOMSVGElementInstanceMap().set(instance, |
+ dom_svg_element_instance_map().set(instance, |
v8::Persistent<v8::Object>::New(result)); |
} |
return result; |
} |
+ |
+// SVG non-node elements may have a reference to a context node which |
+// should be notified when the element is change |
+static void WeakSVGObjectWithContext(v8::Persistent<v8::Value> obj, |
+ void* dom_obj); |
+ |
+// Map of SVG objects with contexts to V8 objects |
+static DOMWrapperMap<void>& dom_svg_object_with_context_map() { |
+ static DOMWrapperMap<void> |
+ static_dom_svg_object_with_context_map(&WeakSVGObjectWithContext); |
+ return static_dom_svg_object_with_context_map; |
+} |
+ |
+// Map of SVG objects with contexts to their contexts |
+static HashMap<void*, SVGElement*>& svg_object_to_context_map() |
+{ |
+ static HashMap<void*, SVGElement*> static_svg_object_to_context_map; |
+ return static_svg_object_to_context_map; |
+} |
+ |
v8::Handle<v8::Value> V8Proxy::SVGObjectWithContextToV8Object( |
V8ClassIndex::V8WrapperType type, void* object) |
{ |
@@ -219,7 +490,7 @@ |
return v8::Null(); |
v8::Persistent<v8::Object> result = |
- getDOMSVGObjectWithContextMap().get(object); |
+ dom_svg_object_with_context_map().get(object); |
if (!result.IsEmpty()) return result; |
// Special case: SVGPathSegs need to be downcast to their real type |
@@ -242,16 +513,38 @@ |
default: |
ASSERT(false); |
} |
- getDOMSVGObjectWithContextMap().set(object, result); |
+ dom_svg_object_with_context_map().set(object, result); |
} |
return result; |
} |
-// Map of SVG objects with contexts to their contexts |
-static HashMap<void*, SVGElement*>& svg_object_to_context_map() { |
- static HashMap<void*, SVGElement*> static_svg_object_to_context_map; |
- return static_svg_object_to_context_map; |
+static void WeakSVGObjectWithContext(v8::Persistent<v8::Value> obj, |
+ void* dom_obj) |
+{ |
+ v8::HandleScope handle_scope; |
+ ASSERT(dom_svg_object_with_context_map().contains(dom_obj)); |
+ ASSERT(obj->IsObject()); |
+ |
+ // Forget function removes object from the map and dispose the wrapper. |
+ dom_svg_object_with_context_map().forget(dom_obj); |
+ |
+ V8ClassIndex::V8WrapperType type = |
+ V8Proxy::GetDOMWrapperType(v8::Handle<v8::Object>::Cast(obj)); |
+ |
+ switch (type) { |
+#define MAKE_CASE(TYPE, NAME) \ |
+ case V8ClassIndex::TYPE: static_cast<NAME*>(dom_obj)->deref(); break; |
+SVG_OBJECT_TYPES(MAKE_CASE) |
+#undef MAKE_CASE |
+#define MAKE_CASE(TYPE, NAME) \ |
+ case V8ClassIndex::TYPE: \ |
+ static_cast<V8SVGPODTypeWrapper<NAME>*>(dom_obj)->deref(); break; |
+SVG_POD_NATIVE_TYPES(MAKE_CASE) |
+#undef MAKE_CASE |
+ default: |
+ ASSERT(false); |
+ } |
} |
void V8Proxy::SetSVGContext(void* obj, SVGElement* context) |
@@ -274,8 +567,66 @@ |
{ |
return svg_object_to_context_map().get(obj); |
} |
+ |
#endif |
+// Called when obj is near death (not reachable from JS roots) |
+// It is time to remove the entry from the table and dispose |
+// the handle. |
+static void WeakDOMObjectCallback(v8::Persistent<v8::Value> obj, |
+ void* dom_obj) { |
+ v8::HandleScope scope; |
+ ASSERT(GetDOMObjectMap().contains(dom_obj)); |
+ ASSERT(obj->IsObject()); |
+ |
+ // Forget function removes object from the map and dispose the wrapper. |
+ GetDOMObjectMap().forget(dom_obj); |
+ |
+ V8ClassIndex::V8WrapperType type = |
+ V8Proxy::GetDOMWrapperType(v8::Handle<v8::Object>::Cast(obj)); |
+ switch (type) { |
+#define MAKE_CASE(TYPE, NAME) \ |
+ case V8ClassIndex::TYPE: static_cast<NAME*>(dom_obj)->deref(); break; |
+ DOM_OBJECT_TYPES(MAKE_CASE) |
+#undef MAKE_CASE |
+ default: |
+ ASSERT(false); |
+ } |
+} |
+ |
+ |
+static void WeakActiveDOMObjectCallback(v8::Persistent<v8::Value> obj, |
+ void* dom_obj) |
+{ |
+ v8::HandleScope scope; |
+ ASSERT(GetActiveDOMObjectMap().contains(dom_obj)); |
+ ASSERT(obj->IsObject()); |
+ |
+ // Forget function removes object from the map and dispose the wrapper. |
+ GetActiveDOMObjectMap().forget(dom_obj); |
+ |
+ V8ClassIndex::V8WrapperType type = |
+ V8Proxy::GetDOMWrapperType(v8::Handle<v8::Object>::Cast(obj)); |
+ switch (type) { |
+#define MAKE_CASE(TYPE, NAME) \ |
+ case V8ClassIndex::TYPE: static_cast<NAME*>(dom_obj)->deref(); break; |
+ ACTIVE_DOM_OBJECT_TYPES(MAKE_CASE) |
+#undef MAKE_CASE |
+ default: |
+ ASSERT(false); |
+ } |
+} |
+ |
+static void WeakNodeCallback(v8::Persistent<v8::Value> obj, void* param) |
+{ |
+ Node* node = static_cast<Node*>(param); |
+ ASSERT(GetDOMNodeMap().contains(node)); |
+ |
+ GetDOMNodeMap().forget(node); |
+ node->deref(); |
+} |
+ |
+ |
// A map from a DOM node to its JS wrapper, the wrapper |
// is kept as a strong reference to survive GCs. |
static DOMObjectMap& gc_protected_map() { |
@@ -290,11 +641,11 @@ |
return; |
if (gc_protected_map().contains(dom_object)) |
return; |
- if (!getDOMObjectMap().contains(dom_object)) |
+ if (!GetDOMObjectMap().contains(dom_object)) |
return; |
// Create a new (strong) persistent handle for the object. |
- v8::Persistent<v8::Object> wrapper = getDOMObjectMap().get(dom_object); |
+ v8::Persistent<v8::Object> wrapper = GetDOMObjectMap().get(dom_object); |
if (wrapper.IsEmpty()) return; |
gc_protected_map().set(dom_object, *v8::Persistent<v8::Object>::New(wrapper)); |
@@ -321,12 +672,12 @@ |
v8::HandleScope scope; |
#ifndef NDEBUG |
- EnumerateDOMObjectMap(getDOMObjectMap().impl()); |
+ EnumerateDOMObjectMap(GetDOMObjectMap().impl()); |
#endif |
// Run through all objects with possible pending activity making their |
// wrappers non weak if there is pending activity. |
- DOMObjectMap active_map = getActiveDOMObjectMap().impl(); |
+ DOMObjectMap active_map = GetActiveDOMObjectMap().impl(); |
for (DOMObjectMap::iterator it = active_map.begin(), end = active_map.end(); |
it != end; ++it) { |
void* obj = it->first; |
@@ -389,7 +740,7 @@ |
typedef std::pair<uintptr_t, Node*> GrouperPair; |
typedef Vector<GrouperPair> GrouperList; |
- DOMNodeMap node_map = getDOMNodeMap().impl(); |
+ DOMNodeMap node_map = GetDOMNodeMap().impl(); |
GrouperList grouper; |
grouper.reserveCapacity(node_map.size()); |
@@ -455,7 +806,7 @@ |
group.reserveCapacity(next_key_index - i); |
for (; i < next_key_index; ++i) { |
v8::Persistent<v8::Value> wrapper = |
- getDOMNodeMap().get(grouper[i].second); |
+ GetDOMNodeMap().get(grouper[i].second); |
if (!wrapper.IsEmpty()) |
group.append(wrapper); |
} |
@@ -474,7 +825,7 @@ |
// Run through all objects with pending activity making their wrappers weak |
// again. |
- DOMObjectMap active_map = getActiveDOMObjectMap().impl(); |
+ DOMObjectMap active_map = GetActiveDOMObjectMap().impl(); |
for (DOMObjectMap::iterator it = active_map.begin(), end = active_map.end(); |
it != end; ++it) { |
void* obj = it->first; |
@@ -486,7 +837,7 @@ |
NAME* impl = static_cast<NAME*>(obj); \ |
if (impl->hasPendingActivity()) { \ |
ASSERT(!wrapper.IsWeak()); \ |
- wrapper.MakeWeak(impl, &weakActiveDOMObjectCallback); \ |
+ wrapper.MakeWeak(impl, &WeakActiveDOMObjectCallback); \ |
} \ |
break; \ |
} |
@@ -499,8 +850,8 @@ |
#ifndef NDEBUG |
// Check all survivals are weak. |
- EnumerateDOMObjectMap(getDOMObjectMap().impl()); |
- EnumerateDOMNodeMap(getDOMNodeMap().impl()); |
+ EnumerateDOMObjectMap(GetDOMObjectMap().impl()); |
+ EnumerateDOMNodeMap(GetDOMNodeMap().impl()); |
EnumerateDOMObjectMap(gc_protected_map()); |
EnumerateGlobalHandles(); |
#undef USE_VAR |
@@ -762,8 +1113,8 @@ |
bool V8Proxy::DOMObjectHasJSWrapper(void* obj) { |
- return getDOMObjectMap().contains(obj) || |
- getActiveDOMObjectMap().contains(obj); |
+ return GetDOMObjectMap().contains(obj) || |
+ GetActiveDOMObjectMap().contains(obj); |
} |
@@ -781,7 +1132,7 @@ |
default: break; |
} |
#endif |
- getDOMObjectMap().set(obj, wrapper); |
+ GetDOMObjectMap().set(obj, wrapper); |
} |
// The caller must have increased obj's ref count. |
@@ -797,14 +1148,14 @@ |
#undef MAKE_CASE |
} |
#endif |
- getActiveDOMObjectMap().set(obj, wrapper); |
+ GetActiveDOMObjectMap().set(obj, wrapper); |
} |
// The caller must have increased node's ref count. |
void V8Proxy::SetJSWrapperForDOMNode(Node* node, v8::Persistent<v8::Object> wrapper) |
{ |
ASSERT(MaybeDOMWrapper(wrapper)); |
- getDOMNodeMap().set(node, wrapper); |
+ GetDOMNodeMap().set(node, wrapper); |
} |
PassRefPtr<EventListener> V8Proxy::createInlineEventListener( |
@@ -2281,8 +2632,8 @@ |
// Non DOM node |
v8::Persistent<v8::Object> result = is_active_dom_object ? |
- getActiveDOMObjectMap().get(imp) : |
- getDOMObjectMap().get(imp); |
+ GetActiveDOMObjectMap().get(imp) : |
+ GetDOMObjectMap().get(imp); |
if (result.IsEmpty()) { |
v8::Local<v8::Object> v8obj = InstantiateV8Object(type, type, imp); |
if (!v8obj.IsEmpty()) { |
@@ -2752,7 +3103,7 @@ |
if (!event) |
return v8::Null(); |
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(event); |
+ v8::Handle<v8::Object> wrapper = GetDOMObjectMap().get(event); |
if (!wrapper.IsEmpty()) |
return wrapper; |
@@ -2811,7 +3162,7 @@ |
{ |
if (!node) return v8::Null(); |
- v8::Handle<v8::Object> wrapper = getDOMNodeMap().get(node); |
+ v8::Handle<v8::Object> wrapper = GetDOMNodeMap().get(node); |
if (!wrapper.IsEmpty()) |
return wrapper; |
@@ -2957,7 +3308,7 @@ |
// XMLHttpRequest is created within its JS counterpart. |
XMLHttpRequest* xhr = target->toXMLHttpRequest(); |
if (xhr) { |
- v8::Handle<v8::Object> wrapper = getActiveDOMObjectMap().get(xhr); |
+ v8::Handle<v8::Object> wrapper = GetActiveDOMObjectMap().get(xhr); |
ASSERT(!wrapper.IsEmpty()); |
return wrapper; |
} |
@@ -2965,14 +3316,14 @@ |
// MessagePort is created within its JS counterpart |
MessagePort* port = target->toMessagePort(); |
if (port) { |
- v8::Handle<v8::Object> wrapper = getActiveDOMObjectMap().get(port); |
+ v8::Handle<v8::Object> wrapper = GetActiveDOMObjectMap().get(port); |
ASSERT(!wrapper.IsEmpty()); |
return wrapper; |
} |
XMLHttpRequestUpload* upload = target->toXMLHttpRequestUpload(); |
if (upload) { |
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(upload); |
+ v8::Handle<v8::Object> wrapper = GetDOMObjectMap().get(upload); |
ASSERT(!wrapper.IsEmpty()); |
return wrapper; |
} |
@@ -3014,7 +3365,7 @@ |
{ |
if (!sheet) return v8::Null(); |
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(sheet); |
+ v8::Handle<v8::Object> wrapper = GetDOMObjectMap().get(sheet); |
if (!wrapper.IsEmpty()) |
return wrapper; |
@@ -3046,7 +3397,7 @@ |
{ |
if (!value) return v8::Null(); |
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(value); |
+ v8::Handle<v8::Object> wrapper = GetDOMObjectMap().get(value); |
if (!wrapper.IsEmpty()) |
return wrapper; |
@@ -3083,7 +3434,7 @@ |
{ |
if (!rule) return v8::Null(); |
- v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(rule); |
+ v8::Handle<v8::Object> wrapper = GetDOMObjectMap().get(rule); |
if (!wrapper.IsEmpty()) |
return wrapper; |