Enable -Wcast-qual for WebInspectorUI, WebKitLegacy, WebKit projects
[WebKit-https.git] / Source / WebKitLegacy / mac / WebView / WebScriptWorld.mm
1 /*
2  * Copyright (C) 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. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #import "WebScriptWorld.h"
26
27 #import "WebScriptWorldInternal.h"
28 #import <WebCore/JSDOMBinding.h>
29 #import <WebCore/ScriptController.h>
30 #import <JavaScriptCore/APICast.h>
31 #import <JavaScriptCore/JSContextInternal.h>
32
33 #import <wtf/RefPtr.h>
34
35 using namespace WebCore;
36
37 @interface WebScriptWorldPrivate : NSObject {
38 @public
39     RefPtr<DOMWrapperWorld> world;
40 }
41 @end
42
43 @implementation WebScriptWorldPrivate
44 @end
45
46 typedef HashMap<DOMWrapperWorld*, WebScriptWorld*> WorldMap;
47 static WorldMap& allWorlds()
48 {
49     static WorldMap& map = *new WorldMap;
50     return map;
51 }
52
53 @implementation WebScriptWorld
54
55 - (id)initWithWorld:(Ref<DOMWrapperWorld>&&)world
56 {
57     self = [super init];
58     if (!self)
59         return nil;
60
61     _private = [[WebScriptWorldPrivate alloc] init];
62     _private->world = WTFMove(world);
63
64     ASSERT_ARG(world, !allWorlds().contains(_private->world.get()));
65     allWorlds().add(_private->world.get(), self);
66
67     return self;
68 }
69
70 - (id)init
71 {
72     return [self initWithWorld:ScriptController::createWorld()];
73 }
74
75 - (void)unregisterWorld
76 {
77     _private->world->clearWrappers();
78 }
79
80 - (void)dealloc
81 {
82     ASSERT(allWorlds().contains(_private->world.get()));
83     allWorlds().remove(_private->world.get());
84
85     [_private release];
86     _private = nil;
87     [super dealloc];
88 }
89
90 + (WebScriptWorld *)standardWorld
91 {
92     static WebScriptWorld *world = [[WebScriptWorld alloc] initWithWorld:mainThreadNormalWorld()];
93     return world;
94 }
95
96 + (WebScriptWorld *)world
97 {
98     return [[[self alloc] init] autorelease];
99 }
100
101 + (WebScriptWorld *)scriptWorldForGlobalContext:(JSGlobalContextRef)context
102 {
103     return [self findOrCreateWorld:currentWorld(toJS(context))];
104 }
105
106 #if JSC_OBJC_API_ENABLED
107 + (WebScriptWorld *)scriptWorldForJavaScriptContext:(JSContext *)context
108 {
109     return [self scriptWorldForGlobalContext:[context JSGlobalContextRef]];
110 }
111 #endif
112
113 @end
114
115 @implementation WebScriptWorld (WebInternal)
116
117 DOMWrapperWorld* core(WebScriptWorld *world)
118 {
119     return world ? world->_private->world.get() : 0;
120 }
121
122 + (WebScriptWorld *)findOrCreateWorld:(DOMWrapperWorld&)world
123 {
124     if (&world == &mainThreadNormalWorld())
125         return [self standardWorld];
126
127     if (WebScriptWorld *existingWorld = allWorlds().get(&world))
128         return existingWorld;
129
130     return [[[self alloc] initWithWorld:world] autorelease];
131 }
132
133 @end