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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 void WindowProxy::takeGlobalFrom(WindowProxy* windowProxy) | 149 void WindowProxy::takeGlobalFrom(WindowProxy* windowProxy) |
150 { | 150 { |
151 v8::HandleScope handleScope(m_isolate); | 151 v8::HandleScope handleScope(m_isolate); |
152 ASSERT(!windowProxy->isContextInitialized()); | 152 ASSERT(!windowProxy->isContextInitialized()); |
153 // If a ScriptState was created, the context was initialized at some point. | 153 // If a ScriptState was created, the context was initialized at some point. |
154 // Make sure the global object was detached from the proxy by calling clearF
orNavigation(). | 154 // Make sure the global object was detached from the proxy by calling clearF
orNavigation(). |
155 if (windowProxy->m_scriptState) | 155 if (windowProxy->m_scriptState) |
156 ASSERT(windowProxy->m_scriptState->isGlobalObjectDetached()); | 156 ASSERT(windowProxy->m_scriptState->isGlobalObjectDetached()); |
157 m_global.set(m_isolate, windowProxy->m_global.newLocal(m_isolate)); | 157 m_global.set(m_isolate, windowProxy->m_global.newLocal(m_isolate)); |
158 windowProxy->m_global.clear(); | 158 windowProxy->m_global.clear(); |
159 // Initialize the window proxy now, to re-establish the connection between | |
160 // the global object and the v8::Context. This is really only needed for a | |
161 // RemoteDOMWindow, since it has no scripting environment of its own. | |
162 // Without this, existing script references to a swapped in RemoteDOMWindow | |
163 // would be broken until that RemoteDOMWindow was vended again through an | |
164 // interface like window.frames. | |
165 initializeIfNeeded(); | |
166 } | 159 } |
167 | 160 |
168 // Create a new environment and setup the global object. | 161 // Create a new environment and setup the global object. |
169 // | 162 // |
170 // The global object corresponds to a DOMWindow instance. However, to | 163 // The global object corresponds to a DOMWindow instance. However, to |
171 // allow properties of the JS DOMWindow instance to be shadowed, we | 164 // allow properties of the JS DOMWindow instance to be shadowed, we |
172 // use a shadow object as the global object and use the JS DOMWindow | 165 // use a shadow object as the global object and use the JS DOMWindow |
173 // instance as the prototype for that shadow object. The JS DOMWindow | 166 // instance as the prototype for that shadow object. The JS DOMWindow |
174 // instance is undetectable from JavaScript code because the __proto__ | 167 // instance is undetectable from JavaScript code because the __proto__ |
175 // accessors skip that object. | 168 // accessors skip that object. |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 // If two tokens are equal, then the SecurityOrigins canAccess each other. | 390 // If two tokens are equal, then the SecurityOrigins canAccess each other. |
398 // If two tokens are not equal, then we have to call canAccess. | 391 // If two tokens are not equal, then we have to call canAccess. |
399 // Note: we can't use the HTTPOrigin if it was set from the DOM. | 392 // Note: we can't use the HTTPOrigin if it was set from the DOM. |
400 String token; | 393 String token; |
401 // There are several situations where v8 needs to do a full canAccess check, | 394 // There are several situations where v8 needs to do a full canAccess check, |
402 // so set an empty security token instead: | 395 // so set an empty security token instead: |
403 // - document.domain was modified | 396 // - document.domain was modified |
404 // - the frame is showing the initial empty document | 397 // - the frame is showing the initial empty document |
405 // - the frame is remote | 398 // - the frame is remote |
406 bool delaySet = m_world->isMainWorld() | 399 bool delaySet = m_world->isMainWorld() |
407 && (m_frame->isRemoteFrame() | 400 && (origin->domainWasSetInDOM() |
408 || origin->domainWasSetInDOM() | 401 || m_frame->isRemoteFrame() |
409 || toLocalFrame(m_frame)->loader().stateMachine()->isDisplayingIniti
alEmptyDocument()); | 402 || toLocalFrame(m_frame)->loader().stateMachine()->isDisplayingIniti
alEmptyDocument()); |
410 if (origin && !delaySet) | 403 if (origin && !delaySet) |
411 token = origin->toString(); | 404 token = origin->toString(); |
412 | 405 |
413 // An empty or "null" token means we always have to call | 406 // An empty or "null" token means we always have to call |
414 // canAccess. The toString method on securityOrigins returns the | 407 // canAccess. The toString method on securityOrigins returns the |
415 // string "null" for empty security origins and for security | 408 // string "null" for empty security origins and for security |
416 // origins that should only allow access to themselves. In this | 409 // origins that should only allow access to themselves. In this |
417 // case, we use the global object as the security token to avoid | 410 // case, we use the global object as the security token to avoid |
418 // calling canAccess when a script accesses its own objects. | 411 // calling canAccess when a script accesses its own objects. |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 | 510 |
518 void WindowProxy::updateSecurityOrigin(SecurityOrigin* origin) | 511 void WindowProxy::updateSecurityOrigin(SecurityOrigin* origin) |
519 { | 512 { |
520 ASSERT(m_world->isMainWorld()); | 513 ASSERT(m_world->isMainWorld()); |
521 if (!isContextInitialized()) | 514 if (!isContextInitialized()) |
522 return; | 515 return; |
523 setSecurityToken(origin); | 516 setSecurityToken(origin); |
524 } | 517 } |
525 | 518 |
526 } // namespace blink | 519 } // namespace blink |
OLD | NEW |