| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008, 2009, 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2008, 2009, 2011 Google Inc. 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 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 // object is NOT observable from user JavaScript code. All other | 197 // object is NOT observable from user JavaScript code. All other |
| 198 // prototype chains are observable. Global proxy object and global object | 198 // prototype chains are observable. Global proxy object and global object |
| 199 // together appear to be the same single JavaScript object. See also: | 199 // together appear to be the same single JavaScript object. See also: |
| 200 // https://wiki.mozilla.org/Gecko:SplitWindow | 200 // https://wiki.mozilla.org/Gecko:SplitWindow |
| 201 // global object (= window wrapper object) provides most of Window's DOM | 201 // global object (= window wrapper object) provides most of Window's DOM |
| 202 // attributes and operations. Also global variables defined by user | 202 // attributes and operations. Also global variables defined by user |
| 203 // JavaScript are placed on this object. When navigated, a new global | 203 // JavaScript are placed on this object. When navigated, a new global |
| 204 // object is created together with a new v8::Context, but the global proxy | 204 // object is created together with a new v8::Context, but the global proxy |
| 205 // object doesn't change. | 205 // object doesn't change. |
| 206 // [3] WindowProperties is a named properties object of Window interface. | 206 // [3] WindowProperties is a named properties object of Window interface. |
| 207 // | |
| 208 // Note that the wrapper object of a DOMWindow is the global proxy object, not | |
| 209 // the global object, although both of them have the internal field which | |
| 210 // points to the DOMWindow. Since the global proxy object remains the same | |
| 211 // while navigations, the management of the wrapper association for DOMWindow | |
| 212 // is special compared to other objects. See DOMWindow::~DOMWindow for the | |
| 213 // need of dissociation of the wrappers from DOMWindow instance. | |
| 214 // | |
| 215 // global proxy object <====> DOMWindow instance | |
| 216 // ^ | |
| 217 // | | |
| 218 // global object --------+ | |
| 219 | 207 |
| 220 DOMWindow* window = m_frame->domWindow(); | 208 DOMWindow* window = m_frame->domWindow(); |
| 221 const WrapperTypeInfo* wrapperTypeInfo = window->wrapperTypeInfo(); | 209 const WrapperTypeInfo* wrapperTypeInfo = window->wrapperTypeInfo(); |
| 222 v8::Local<v8::Context> context = m_scriptState->context(); | 210 v8::Local<v8::Context> context = m_scriptState->context(); |
| 223 | 211 |
| 224 // The global proxy object. Note this is not the global object. | 212 // The global proxy object. Note this is not the global object. |
| 225 v8::Local<v8::Object> globalProxy = context->Global(); | 213 v8::Local<v8::Object> globalProxy = context->Global(); |
| 226 CHECK(m_globalProxy == globalProxy); | 214 CHECK(m_globalProxy == globalProxy); |
| 227 v8::Local<v8::Object> associatedWrapper = | 215 V8DOMWrapper::setNativeInfo(m_isolate, globalProxy, wrapperTypeInfo, window); |
| 228 V8DOMWrapper::associateObjectWithWrapper( | |
| 229 m_isolate, window, wrapperTypeInfo, globalProxy); | |
| 230 CHECK(globalProxy == associatedWrapper); | |
| 231 // Mark the handle to be traced by Oilpan, since the global proxy has a | 216 // Mark the handle to be traced by Oilpan, since the global proxy has a |
| 232 // reference to the DOMWindow. | 217 // reference to the DOMWindow. |
| 233 m_globalProxy.get().SetWrapperClassId(wrapperTypeInfo->wrapperClassId); | 218 m_globalProxy.get().SetWrapperClassId(wrapperTypeInfo->wrapperClassId); |
| 234 | 219 |
| 235 // The global object, aka window wrapper object. | 220 // The global object, aka window wrapper object. |
| 236 v8::Local<v8::Object> windowWrapper = | 221 v8::Local<v8::Object> windowWrapper = |
| 237 globalProxy->GetPrototype().As<v8::Object>(); | 222 globalProxy->GetPrototype().As<v8::Object>(); |
| 238 V8DOMWrapper::setNativeInfo(m_isolate, windowWrapper, wrapperTypeInfo, | 223 windowWrapper = V8DOMWrapper::associateObjectWithWrapper( |
| 239 window); | 224 m_isolate, window, wrapperTypeInfo, windowWrapper); |
| 240 | 225 |
| 241 // The prototype object of Window interface. | 226 // The prototype object of Window interface. |
| 242 v8::Local<v8::Object> windowPrototype = | 227 v8::Local<v8::Object> windowPrototype = |
| 243 windowWrapper->GetPrototype().As<v8::Object>(); | 228 windowWrapper->GetPrototype().As<v8::Object>(); |
| 244 CHECK(!windowPrototype.IsEmpty()); | 229 CHECK(!windowPrototype.IsEmpty()); |
| 245 V8DOMWrapper::setNativeInfo(m_isolate, windowPrototype, wrapperTypeInfo, | 230 V8DOMWrapper::setNativeInfo(m_isolate, windowPrototype, wrapperTypeInfo, |
| 246 window); | 231 window); |
| 247 | 232 |
| 248 // The named properties object of Window interface. | 233 // The named properties object of Window interface. |
| 249 v8::Local<v8::Object> windowProperties = | 234 v8::Local<v8::Object> windowProperties = |
| 250 windowPrototype->GetPrototype().As<v8::Object>(); | 235 windowPrototype->GetPrototype().As<v8::Object>(); |
| 251 CHECK(!windowProperties.IsEmpty()); | 236 CHECK(!windowProperties.IsEmpty()); |
| 252 V8DOMWrapper::setNativeInfo(m_isolate, windowProperties, wrapperTypeInfo, | 237 V8DOMWrapper::setNativeInfo(m_isolate, windowProperties, wrapperTypeInfo, |
| 253 window); | 238 window); |
| 254 | 239 |
| 255 // TODO(keishi): Remove installPagePopupController and implement | 240 // TODO(keishi): Remove installPagePopupController and implement |
| 256 // PagePopupController in another way. | 241 // PagePopupController in another way. |
| 257 V8PagePopupControllerBinding::installPagePopupController(context, | 242 V8PagePopupControllerBinding::installPagePopupController(context, |
| 258 windowWrapper); | 243 windowWrapper); |
| 259 } | 244 } |
| 260 | 245 |
| 261 } // namespace blink | 246 } // namespace blink |
| OLD | NEW |