[WTF] Remove StaticLock
[WebKit.git] / Source / WebKitLegacy / mac / DOM / DOMInternal.mm
1 /*
2  * Copyright (C) 2004, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "DOMInternal.h"
27
28 #import "DOMNodeInternal.h"
29 #import <WebCore/Document.h>
30 #import <WebCore/Frame.h>
31 #import <WebCore/JSNode.h>
32 #import <WebCore/ScriptController.h>
33 #import <WebCore/WebScriptObjectPrivate.h>
34 #import <WebCore/runtime_root.h>
35 #import <wtf/HashMap.h>
36 #import <wtf/Lock.h>
37 #import <wtf/NeverDestroyed.h>
38
39 #if PLATFORM(IOS)
40 #define NEEDS_WRAPPER_CACHE_LOCK 1
41 #endif
42
43 //------------------------------------------------------------------------------------------
44 // Wrapping WebCore implementation objects
45
46 #ifdef NEEDS_WRAPPER_CACHE_LOCK
47 static Lock wrapperCacheLock;
48 #endif
49
50 static HashMap<DOMObjectInternal*, NSObject *>& wrapperCache()
51 {
52     static NeverDestroyed<HashMap<DOMObjectInternal*, NSObject *>> map;
53     return map;
54 }
55
56 NSObject* getDOMWrapper(DOMObjectInternal* impl)
57 {
58 #ifdef NEEDS_WRAPPER_CACHE_LOCK
59     std::lock_guard<Lock> lock(wrapperCacheLock);
60 #endif
61     return wrapperCache().get(impl);
62 }
63
64 void addDOMWrapper(NSObject* wrapper, DOMObjectInternal* impl)
65 {
66 #ifdef NEEDS_WRAPPER_CACHE_LOCK
67     std::lock_guard<Lock> lock(wrapperCacheLock);
68 #endif
69     wrapperCache().set(impl, wrapper);
70 }
71
72 void removeDOMWrapper(DOMObjectInternal* impl)
73 {
74 #ifdef NEEDS_WRAPPER_CACHE_LOCK
75     std::lock_guard<Lock> lock(wrapperCacheLock);
76 #endif
77     wrapperCache().remove(impl);
78 }
79
80 //------------------------------------------------------------------------------------------
81
82 @implementation WebScriptObject (WebScriptObjectInternal)
83
84 // Only called by DOMObject subclass.
85 - (id)_init
86 {
87     self = [super init];
88
89     if (![self isKindOfClass:[DOMObject class]]) {
90         [NSException raise:NSGenericException format:@"+%@: _init is an internal initializer", [self class]];
91         return nil;
92     }
93
94     _private = [[WebScriptObjectPrivate alloc] init];
95     _private->isCreatedByDOMWrapper = YES;
96     
97     return self;
98 }
99
100 - (void)_initializeScriptDOMNodeImp
101 {
102     ASSERT(_private->isCreatedByDOMWrapper);
103     
104     if (![self isKindOfClass:[DOMNode class]]) {
105         // DOMObject can't map back to a document, and thus an interpreter,
106         // so for now only create wrappers for DOMNodes.
107         return;
108     }
109     
110     // Extract the WebCore::Node from the ObjectiveC wrapper.
111     DOMNode *n = (DOMNode *)self;
112     WebCore::Node *nodeImpl = core(n);
113
114     // Dig up Interpreter and ExecState.
115     WebCore::Frame *frame = nodeImpl->document().frame();
116     if (!frame)
117         return;
118
119     // The global object which should own this node - FIXME: does this need to be isolated-world aware?
120     WebCore::JSDOMGlobalObject* globalObject = frame->script().globalObject(WebCore::mainThreadNormalWorld());
121     JSC::ExecState *exec = globalObject->globalExec();
122
123     // Get (or create) a cached JS object for the DOM node.
124     JSC::JSObject *scriptImp = asObject(WebCore::toJS(exec, globalObject, nodeImpl));
125
126     JSC::Bindings::RootObject* rootObject = frame->script().bindingRootObject();
127
128     [self _setImp:scriptImp originRootObject:rootObject rootObject:rootObject];
129 }
130
131 @end