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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 void V8WindowShell::clearForNavigation() | 123 void V8WindowShell::clearForNavigation() |
124 { | 124 { |
125 if (!isContextInitialized()) | 125 if (!isContextInitialized()) |
126 return; | 126 return; |
127 | 127 |
128 ScriptState::Scope scope(m_scriptState.get()); | 128 ScriptState::Scope scope(m_scriptState.get()); |
129 | 129 |
130 m_document.clear(); | 130 m_document.clear(); |
131 | 131 |
132 // Clear the document wrapper cache before turning on access checks on | 132 // Clear the document wrapper cache before turning on access checks on |
133 // the old DOMWindow wrapper. This way, access to the document wrapper | 133 // the old LocalDOMWindow wrapper. This way, access to the document wrapper |
134 // will be protected by the security checks on the DOMWindow wrapper. | 134 // will be protected by the security checks on the LocalDOMWindow wrapper. |
135 clearDocumentProperty(); | 135 clearDocumentProperty(); |
136 | 136 |
137 v8::Handle<v8::Object> windowWrapper = V8Window::findInstanceInPrototypeChai
n(m_global.newLocal(m_isolate), m_isolate); | 137 v8::Handle<v8::Object> windowWrapper = V8Window::findInstanceInPrototypeChai
n(m_global.newLocal(m_isolate), m_isolate); |
138 ASSERT(!windowWrapper.IsEmpty()); | 138 ASSERT(!windowWrapper.IsEmpty()); |
139 windowWrapper->TurnOnAccessCheck(); | 139 windowWrapper->TurnOnAccessCheck(); |
140 disposeContext(DetachGlobal); | 140 disposeContext(DetachGlobal); |
141 } | 141 } |
142 | 142 |
143 // Create a new environment and setup the global object. | 143 // Create a new environment and setup the global object. |
144 // | 144 // |
145 // The global object corresponds to a DOMWindow instance. However, to | 145 // The global object corresponds to a LocalDOMWindow instance. However, to |
146 // allow properties of the JS DOMWindow instance to be shadowed, we | 146 // allow properties of the JS LocalDOMWindow instance to be shadowed, we |
147 // use a shadow object as the global object and use the JS DOMWindow | 147 // use a shadow object as the global object and use the JS LocalDOMWindow |
148 // instance as the prototype for that shadow object. The JS DOMWindow | 148 // instance as the prototype for that shadow object. The JS LocalDOMWindow |
149 // instance is undetectable from JavaScript code because the __proto__ | 149 // instance is undetectable from JavaScript code because the __proto__ |
150 // accessors skip that object. | 150 // accessors skip that object. |
151 // | 151 // |
152 // The shadow object and the DOMWindow instance are seen as one object | 152 // The shadow object and the LocalDOMWindow instance are seen as one object |
153 // from JavaScript. The JavaScript object that corresponds to a | 153 // from JavaScript. The JavaScript object that corresponds to a |
154 // DOMWindow instance is the shadow object. When mapping a DOMWindow | 154 // LocalDOMWindow instance is the shadow object. When mapping a LocalDOMWindow |
155 // instance to a V8 object, we return the shadow object. | 155 // instance to a V8 object, we return the shadow object. |
156 // | 156 // |
157 // To implement split-window, see | 157 // To implement split-window, see |
158 // 1) https://bugs.webkit.org/show_bug.cgi?id=17249 | 158 // 1) https://bugs.webkit.org/show_bug.cgi?id=17249 |
159 // 2) https://wiki.mozilla.org/Gecko:SplitWindow | 159 // 2) https://wiki.mozilla.org/Gecko:SplitWindow |
160 // 3) https://bugzilla.mozilla.org/show_bug.cgi?id=296639 | 160 // 3) https://bugzilla.mozilla.org/show_bug.cgi?id=296639 |
161 // we need to split the shadow object further into two objects: | 161 // we need to split the shadow object further into two objects: |
162 // an outer window and an inner window. The inner window is the hidden | 162 // an outer window and an inner window. The inner window is the hidden |
163 // prototype of the outer window. The inner window is the default | 163 // prototype of the outer window. The inner window is the default |
164 // global object of the context. A variable declared in the global | 164 // global object of the context. A variable declared in the global |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 blink::Platform::current()->histogramCustomCounts(histogramName, contextCrea
tionDurationInMilliseconds, 0, 10000, 50); | 283 blink::Platform::current()->histogramCustomCounts(histogramName, contextCrea
tionDurationInMilliseconds, 0, 10000, 50); |
284 } | 284 } |
285 | 285 |
286 static v8::Handle<v8::Object> toInnerGlobalObject(v8::Handle<v8::Context> contex
t) | 286 static v8::Handle<v8::Object> toInnerGlobalObject(v8::Handle<v8::Context> contex
t) |
287 { | 287 { |
288 return v8::Handle<v8::Object>::Cast(context->Global()->GetPrototype()); | 288 return v8::Handle<v8::Object>::Cast(context->Global()->GetPrototype()); |
289 } | 289 } |
290 | 290 |
291 bool V8WindowShell::installDOMWindow() | 291 bool V8WindowShell::installDOMWindow() |
292 { | 292 { |
293 DOMWindow* window = m_frame->domWindow(); | 293 LocalDOMWindow* window = m_frame->domWindow(); |
294 v8::Local<v8::Object> windowWrapper = V8ObjectConstructor::newInstance(m_iso
late, m_scriptState->perContextData()->constructorForType(&V8Window::wrapperType
Info)); | 294 v8::Local<v8::Object> windowWrapper = V8ObjectConstructor::newInstance(m_iso
late, m_scriptState->perContextData()->constructorForType(&V8Window::wrapperType
Info)); |
295 if (windowWrapper.IsEmpty()) | 295 if (windowWrapper.IsEmpty()) |
296 return false; | 296 return false; |
297 | 297 |
298 V8Window::installPerContextEnabledProperties(windowWrapper, window, m_isolat
e); | 298 V8Window::installPerContextEnabledProperties(windowWrapper, window, m_isolat
e); |
299 | 299 |
300 V8DOMWrapper::setNativeInfoForHiddenWrapper(v8::Handle<v8::Object>::Cast(win
dowWrapper->GetPrototype()), &V8Window::wrapperTypeInfo, window); | 300 V8DOMWrapper::setNativeInfoForHiddenWrapper(v8::Handle<v8::Object>::Cast(win
dowWrapper->GetPrototype()), &V8Window::wrapperTypeInfo, window); |
301 | 301 |
302 // Install the windowWrapper as the prototype of the innerGlobalObject. | 302 // Install the windowWrapper as the prototype of the innerGlobalObject. |
303 // The full structure of the global object is as follows: | 303 // The full structure of the global object is as follows: |
304 // | 304 // |
305 // outerGlobalObject (Empty object, remains after navigation) | 305 // outerGlobalObject (Empty object, remains after navigation) |
306 // -- has prototype --> innerGlobalObject (Holds global variables, changes
during navigation) | 306 // -- has prototype --> innerGlobalObject (Holds global variables, changes
during navigation) |
307 // -- has prototype --> DOMWindow instance | 307 // -- has prototype --> LocalDOMWindow instance |
308 // -- has prototype --> Window.prototype | 308 // -- has prototype --> Window.prototype |
309 // -- has prototype --> Object.prototype | 309 // -- has prototype --> Object.prototype |
310 // | 310 // |
311 // Note: Much of this prototype structure is hidden from web content. The | 311 // Note: Much of this prototype structure is hidden from web content. The |
312 // outer, inner, and DOMWindow instance all appear to be the same | 312 // outer, inner, and LocalDOMWindow instance all appear to be the same |
313 // JavaScript object. | 313 // JavaScript object. |
314 // | 314 // |
315 // Note: With Oilpan, the DOMWindow object is garbage collected. | 315 // Note: With Oilpan, the LocalDOMWindow object is garbage collected. |
316 // Persistent references to this inner global object view of the DOMWi
ndow | 316 // Persistent references to this inner global object view of the Local
DOMWindow |
317 // aren't kept, as that would prevent the global object from ever bein
g released. | 317 // aren't kept, as that would prevent the global object from ever bein
g released. |
318 // It is safe not to do so, as the wrapper for the DOMWindow being ins
talled here | 318 // It is safe not to do so, as the wrapper for the LocalDOMWindow bein
g installed here |
319 // already keeps a persistent reference, and it along with the inner g
lobal object | 319 // already keeps a persistent reference, and it along with the inner g
lobal object |
320 // views of the DOMWindow will die together once that wrapper clears t
he persistent | 320 // views of the LocalDOMWindow will die together once that wrapper cle
ars the persistent |
321 // reference. | 321 // reference. |
322 v8::Handle<v8::Object> innerGlobalObject = toInnerGlobalObject(m_scriptState
->context()); | 322 v8::Handle<v8::Object> innerGlobalObject = toInnerGlobalObject(m_scriptState
->context()); |
323 V8DOMWrapper::setNativeInfoForHiddenWrapper(innerGlobalObject, &V8Window::wr
apperTypeInfo, window); | 323 V8DOMWrapper::setNativeInfoForHiddenWrapper(innerGlobalObject, &V8Window::wr
apperTypeInfo, window); |
324 innerGlobalObject->SetPrototype(windowWrapper); | 324 innerGlobalObject->SetPrototype(windowWrapper); |
325 V8DOMWrapper::associateObjectWithWrapper<V8Window>(PassRefPtrWillBeRawPtr<DO
MWindow>(window), &V8Window::wrapperTypeInfo, windowWrapper, m_isolate, WrapperC
onfiguration::Dependent); | 325 V8DOMWrapper::associateObjectWithWrapper<V8Window>(PassRefPtrWillBeRawPtr<Lo
calDOMWindow>(window), &V8Window::wrapperTypeInfo, windowWrapper, m_isolate, Wra
pperConfiguration::Dependent); |
326 return true; | 326 return true; |
327 } | 327 } |
328 | 328 |
329 void V8WindowShell::updateDocumentWrapper(v8::Handle<v8::Object> wrapper) | 329 void V8WindowShell::updateDocumentWrapper(v8::Handle<v8::Object> wrapper) |
330 { | 330 { |
331 ASSERT(m_world->isMainWorld()); | 331 ASSERT(m_world->isMainWorld()); |
332 m_document.set(m_isolate, wrapper); | 332 m_document.set(m_isolate, wrapper); |
333 } | 333 } |
334 | 334 |
335 void V8WindowShell::updateDocumentProperty() | 335 void V8WindowShell::updateDocumentProperty() |
336 { | 336 { |
337 if (!m_world->isMainWorld()) | 337 if (!m_world->isMainWorld()) |
338 return; | 338 return; |
339 | 339 |
340 ScriptState::Scope scope(m_scriptState.get()); | 340 ScriptState::Scope scope(m_scriptState.get()); |
341 v8::Handle<v8::Context> context = m_scriptState->context(); | 341 v8::Handle<v8::Context> context = m_scriptState->context(); |
342 v8::Handle<v8::Value> documentWrapper = toV8(m_frame->document(), context->G
lobal(), context->GetIsolate()); | 342 v8::Handle<v8::Value> documentWrapper = toV8(m_frame->document(), context->G
lobal(), context->GetIsolate()); |
343 ASSERT(documentWrapper == m_document.newLocal(m_isolate) || m_document.isEmp
ty()); | 343 ASSERT(documentWrapper == m_document.newLocal(m_isolate) || m_document.isEmp
ty()); |
344 if (m_document.isEmpty()) | 344 if (m_document.isEmpty()) |
345 updateDocumentWrapper(v8::Handle<v8::Object>::Cast(documentWrapper)); | 345 updateDocumentWrapper(v8::Handle<v8::Object>::Cast(documentWrapper)); |
346 checkDocumentWrapper(m_document.newLocal(m_isolate), m_frame->document()); | 346 checkDocumentWrapper(m_document.newLocal(m_isolate), m_frame->document()); |
347 | 347 |
348 // If instantiation of the document wrapper fails, clear the cache | 348 // If instantiation of the document wrapper fails, clear the cache |
349 // and let the DOMWindow accessor handle access to the document. | 349 // and let the LocalDOMWindow accessor handle access to the document. |
350 if (documentWrapper.IsEmpty()) { | 350 if (documentWrapper.IsEmpty()) { |
351 clearDocumentProperty(); | 351 clearDocumentProperty(); |
352 return; | 352 return; |
353 } | 353 } |
354 ASSERT(documentWrapper->IsObject()); | 354 ASSERT(documentWrapper->IsObject()); |
355 context->Global()->ForceSet(v8AtomicString(m_isolate, "document"), documentW
rapper, static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); | 355 context->Global()->ForceSet(v8AtomicString(m_isolate, "document"), documentW
rapper, static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
356 | 356 |
357 // We also stash a reference to the document on the inner global object so t
hat | 357 // We also stash a reference to the document on the inner global object so t
hat |
358 // DOMWindow objects we obtain from JavaScript references are guaranteed to
have | 358 // LocalDOMWindow objects we obtain from JavaScript references are guarantee
d to have |
359 // live Document objects. | 359 // live Document objects. |
360 V8HiddenValue::setHiddenValue(m_isolate, toInnerGlobalObject(context), V8Hid
denValue::document(m_isolate), documentWrapper); | 360 V8HiddenValue::setHiddenValue(m_isolate, toInnerGlobalObject(context), V8Hid
denValue::document(m_isolate), documentWrapper); |
361 } | 361 } |
362 | 362 |
363 void V8WindowShell::clearDocumentProperty() | 363 void V8WindowShell::clearDocumentProperty() |
364 { | 364 { |
365 ASSERT(isContextInitialized()); | 365 ASSERT(isContextInitialized()); |
366 if (!m_world->isMainWorld()) | 366 if (!m_world->isMainWorld()) |
367 return; | 367 return; |
368 v8::HandleScope handleScope(m_isolate); | 368 v8::HandleScope handleScope(m_isolate); |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 | 492 |
493 void V8WindowShell::updateSecurityOrigin(SecurityOrigin* origin) | 493 void V8WindowShell::updateSecurityOrigin(SecurityOrigin* origin) |
494 { | 494 { |
495 ASSERT(m_world->isMainWorld()); | 495 ASSERT(m_world->isMainWorld()); |
496 if (!isContextInitialized()) | 496 if (!isContextInitialized()) |
497 return; | 497 return; |
498 setSecurityToken(origin); | 498 setSecurityToken(origin); |
499 } | 499 } |
500 | 500 |
501 } // WebCore | 501 } // WebCore |
OLD | NEW |