50dd00f426869073b6793bd06d7b83824afa3fba
[WebKit-https.git] / WebCore / bindings / js / JSDOMWindowCustom.cpp
1 /*
2  * Copyright (C) 2007 Apple, Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "JSDOMWindow.h"
22
23 #include "kjs_window.h"
24 #include "DOMWindow.h"
25
26 namespace WebCore {
27
28 bool JSDOMWindow::customGetOwnPropertySlot(KJS::ExecState* exec, const KJS::Identifier& propertyName, KJS::PropertySlot& slot)
29 {
30     // we don't want any properties other than "closed" on a closed window
31     if (!impl()->frame()) {
32         if (propertyName == "closed") {
33             const KJS::HashEntry* entry = KJS::Lookup::findEntry(classInfo()->propHashTable, propertyName);
34             ASSERT(entry);
35             if (entry) {
36                 slot.setStaticEntry(this, entry, KJS::staticValueGetter<JSDOMWindow>);
37                 return true;
38             }
39         }
40         if (propertyName == "close") {
41             KJS::JSValue* proto = prototype();
42             if (proto->isObject()) {
43                 const KJS::HashEntry* entry = KJS::Lookup::findEntry(static_cast<KJS::JSObject*>(proto)->classInfo()->propHashTable, propertyName);
44                 ASSERT(entry);
45                 if (entry) {
46                     slot.setStaticEntry(this, entry, KJS::staticFunctionGetter);
47                     return true;
48                 }
49             }
50         }
51
52         slot.setUndefined(this);
53         return true;
54     }
55
56     // Look for overrides first
57     if (JSGlobalObject::getOwnPropertySlot(exec, propertyName, slot)) {
58         if (!allowsAccessFrom(exec))
59             slot.setUndefined(this);
60
61         return true;
62     }
63
64     // FIXME: We need this to work around the blanket same origin (allowsAccessFrom) check in KJS::Window.  Once we remove that, we
65     // can move this to JSDOMWindowPrototype.
66     KJS::JSValue* proto = prototype();
67     if (proto->isObject()) {
68         const KJS::HashEntry* entry = KJS::Lookup::findEntry(static_cast<KJS::JSObject*>(proto)->classInfo()->propHashTable, propertyName);
69         if (entry) {
70             if (entry->attr & KJS::Function) {
71                 if (entry->value.functionValue == &JSDOMWindowPrototypeFunctionFocus::create
72                     || entry->value.functionValue == &JSDOMWindowPrototypeFunctionBlur::create
73                     || entry->value.functionValue == &JSDOMWindowPrototypeFunctionClose::create)
74                         slot.setStaticEntry(this, entry, KJS::staticFunctionGetter);
75                 else {
76                     if (!allowsAccessFrom(exec))
77                         slot.setUndefined(this);
78                     else
79                         slot.setStaticEntry(this, entry, KJS::staticFunctionGetter);
80                 }
81                 return true;
82             }
83         }
84     }
85
86     return false;
87 }
88
89 bool JSDOMWindow::customPut(KJS::ExecState* exec, const KJS::Identifier& propertyName, KJS::JSValue* value, int attr)
90 {
91     if (!impl()->frame())
92         return true;
93
94     // Called by an internal KJS, save time and jump directly to JSGlobalObject.
95     if (attr != KJS::None && attr != KJS::DontDelete) {
96         KJS::JSGlobalObject::put(exec, propertyName, value, attr);
97         return true;
98     }
99
100     // We have a local override (e.g. "var location"), save time and jump directly to JSGlobalObject.
101     KJS::PropertySlot slot;
102     if (KJS::JSGlobalObject::getOwnPropertySlot(exec, propertyName, slot)) {
103         if (allowsAccessFrom(exec))
104             KJS::JSGlobalObject::put(exec, propertyName, value, attr);
105         return true;
106     }
107
108     return false;
109 }
110
111 } // namespace WebCore