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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 | 102 |
103 void WindowProxy::clearForNavigation() | 103 void WindowProxy::clearForNavigation() |
104 { | 104 { |
105 if (!isContextInitialized()) | 105 if (!isContextInitialized()) |
106 return; | 106 return; |
107 | 107 |
108 ScriptState::Scope scope(m_scriptState.get()); | 108 ScriptState::Scope scope(m_scriptState.get()); |
109 | 109 |
110 m_document.clear(); | 110 m_document.clear(); |
111 | 111 |
112 // Clear the document wrapper cache before turning on access checks on | |
113 // the old LocalDOMWindow wrapper. This way, access to the document wrapper | |
114 // will be protected by the security checks on the LocalDOMWindow wrapper. | |
115 clearDocumentProperty(); | |
116 | |
117 v8::Handle<v8::Object> windowWrapper = V8Window::findInstanceInPrototypeChai
n(m_global.newLocal(m_isolate), m_isolate); | 112 v8::Handle<v8::Object> windowWrapper = V8Window::findInstanceInPrototypeChai
n(m_global.newLocal(m_isolate), m_isolate); |
118 ASSERT(!windowWrapper.IsEmpty()); | 113 ASSERT(!windowWrapper.IsEmpty()); |
119 windowWrapper->TurnOnAccessCheck(); | 114 windowWrapper->TurnOnAccessCheck(); |
120 disposeContext(DetachGlobal); | 115 disposeContext(DetachGlobal); |
121 } | 116 } |
122 | 117 |
123 // Create a new environment and setup the global object. | 118 // Create a new environment and setup the global object. |
124 // | 119 // |
125 // The global object corresponds to a LocalDOMWindow instance. However, to | 120 // The global object corresponds to a LocalDOMWindow instance. However, to |
126 // allow properties of the JS LocalDOMWindow instance to be shadowed, we | 121 // allow properties of the JS LocalDOMWindow instance to be shadowed, we |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 | 276 |
282 void WindowProxy::updateDocumentProperty() | 277 void WindowProxy::updateDocumentProperty() |
283 { | 278 { |
284 ScriptState::Scope scope(m_scriptState.get()); | 279 ScriptState::Scope scope(m_scriptState.get()); |
285 v8::Handle<v8::Context> context = m_scriptState->context(); | 280 v8::Handle<v8::Context> context = m_scriptState->context(); |
286 v8::Handle<v8::Value> documentWrapper = toV8(m_frame->document(), context->G
lobal(), context->GetIsolate()); | 281 v8::Handle<v8::Value> documentWrapper = toV8(m_frame->document(), context->G
lobal(), context->GetIsolate()); |
287 ASSERT(documentWrapper == m_document.newLocal(m_isolate) || m_document.isEmp
ty()); | 282 ASSERT(documentWrapper == m_document.newLocal(m_isolate) || m_document.isEmp
ty()); |
288 if (m_document.isEmpty()) | 283 if (m_document.isEmpty()) |
289 updateDocumentWrapper(v8::Handle<v8::Object>::Cast(documentWrapper)); | 284 updateDocumentWrapper(v8::Handle<v8::Object>::Cast(documentWrapper)); |
290 | 285 |
291 // If instantiation of the document wrapper fails, clear the cache | |
292 // and let the LocalDOMWindow accessor handle access to the document. | |
293 if (documentWrapper.IsEmpty()) { | |
294 clearDocumentProperty(); | |
295 return; | |
296 } | |
297 ASSERT(documentWrapper->IsObject()); | 286 ASSERT(documentWrapper->IsObject()); |
298 context->Global()->ForceSet(v8AtomicString(m_isolate, "document"), documentW
rapper, static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); | 287 context->Global()->ForceSet(v8AtomicString(m_isolate, "document"), documentW
rapper, static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); |
299 | 288 |
300 // We also stash a reference to the document on the inner global object so t
hat | 289 // We also stash a reference to the document on the inner global object so t
hat |
301 // LocalDOMWindow objects we obtain from JavaScript references are guarantee
d to have | 290 // LocalDOMWindow objects we obtain from JavaScript references are guarantee
d to have |
302 // live Document objects. | 291 // live Document objects. |
303 V8HiddenValue::setHiddenValue(m_isolate, toInnerGlobalObject(context), V8Hid
denValue::document(m_isolate), documentWrapper); | 292 V8HiddenValue::setHiddenValue(m_isolate, toInnerGlobalObject(context), V8Hid
denValue::document(m_isolate), documentWrapper); |
304 } | 293 } |
305 | 294 |
306 void WindowProxy::clearDocumentProperty() | |
307 { | |
308 ASSERT(isContextInitialized()); | |
309 if (!m_world->isMainWorld()) | |
310 return; | |
311 v8::HandleScope handleScope(m_isolate); | |
312 m_scriptState->context()->Global()->ForceDelete(v8AtomicString(m_isolate, "d
ocument")); | |
313 } | |
314 | |
315 void WindowProxy::updateDocument() | 295 void WindowProxy::updateDocument() |
316 { | 296 { |
317 ASSERT(m_world->isMainWorld()); | 297 ASSERT(m_world->isMainWorld()); |
318 if (!isGlobalInitialized()) | 298 if (!isGlobalInitialized()) |
319 return; | 299 return; |
320 if (!isContextInitialized()) | 300 if (!isContextInitialized()) |
321 return; | 301 return; |
322 updateDocumentProperty(); | 302 updateDocumentProperty(); |
323 } | 303 } |
324 | 304 |
325 } // namespace blink | 305 } // namespace blink |
OLD | NEW |