| 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 DOMWrapperWorld& world) { | 81 DOMWrapperWorld& world) { |
| 82 return new WindowProxy(frame, &world, isolate); | 82 return new WindowProxy(frame, &world, isolate); |
| 83 } | 83 } |
| 84 | 84 |
| 85 WindowProxy::WindowProxy(Frame* frame, | 85 WindowProxy::WindowProxy(Frame* frame, |
| 86 PassRefPtr<DOMWrapperWorld> world, | 86 PassRefPtr<DOMWrapperWorld> world, |
| 87 v8::Isolate* isolate) | 87 v8::Isolate* isolate) |
| 88 : m_frame(frame), m_isolate(isolate), m_world(world) {} | 88 : m_frame(frame), m_isolate(isolate), m_world(world) {} |
| 89 | 89 |
| 90 WindowProxy::~WindowProxy() { | 90 WindowProxy::~WindowProxy() { |
| 91 // clearForClose() or clearForNavigation() must be invoked before destruction
starts. | 91 // clearForClose() or clearForNavigation() must be invoked before destruction |
| 92 // starts. |
| 92 ASSERT(!isContextInitialized()); | 93 ASSERT(!isContextInitialized()); |
| 93 } | 94 } |
| 94 | 95 |
| 95 DEFINE_TRACE(WindowProxy) { | 96 DEFINE_TRACE(WindowProxy) { |
| 96 visitor->trace(m_frame); | 97 visitor->trace(m_frame); |
| 97 } | 98 } |
| 98 | 99 |
| 99 void WindowProxy::disposeContext(GlobalDetachmentBehavior behavior) { | 100 void WindowProxy::disposeContext(GlobalDetachmentBehavior behavior) { |
| 100 if (!isContextInitialized()) | 101 if (!isContextInitialized()) |
| 101 return; | 102 return; |
| 102 | 103 |
| 103 v8::HandleScope handleScope(m_isolate); | 104 v8::HandleScope handleScope(m_isolate); |
| 104 v8::Local<v8::Context> context = m_scriptState->context(); | 105 v8::Local<v8::Context> context = m_scriptState->context(); |
| 105 if (m_frame->isLocalFrame()) { | 106 if (m_frame->isLocalFrame()) { |
| 106 LocalFrame* frame = toLocalFrame(m_frame); | 107 LocalFrame* frame = toLocalFrame(m_frame); |
| 107 // The embedder could run arbitrary code in response to the willReleaseScrip
tContext callback, so all disposing should happen after it returns. | 108 // The embedder could run arbitrary code in response to the |
| 109 // willReleaseScriptContext callback, so all disposing should happen after |
| 110 // it returns. |
| 108 frame->loader().client()->willReleaseScriptContext(context, | 111 frame->loader().client()->willReleaseScriptContext(context, |
| 109 m_world->worldId()); | 112 m_world->worldId()); |
| 110 MainThreadDebugger::instance()->contextWillBeDestroyed(m_scriptState.get()); | 113 MainThreadDebugger::instance()->contextWillBeDestroyed(m_scriptState.get()); |
| 111 } | 114 } |
| 112 | 115 |
| 113 m_document.clear(); | 116 m_document.clear(); |
| 114 | 117 |
| 115 if (behavior == DetachGlobal) | 118 if (behavior == DetachGlobal) |
| 116 m_scriptState->detachGlobalObject(); | 119 m_scriptState->detachGlobalObject(); |
| 117 | 120 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 144 if (!isContextInitialized()) | 147 if (!isContextInitialized()) |
| 145 return v8::Local<v8::Object>(); | 148 return v8::Local<v8::Object>(); |
| 146 ASSERT(m_scriptState->contextIsValid()); | 149 ASSERT(m_scriptState->contextIsValid()); |
| 147 ASSERT(m_global == m_scriptState->context()->Global()); | 150 ASSERT(m_global == m_scriptState->context()->Global()); |
| 148 return m_global.newLocal(m_isolate); | 151 return m_global.newLocal(m_isolate); |
| 149 } | 152 } |
| 150 | 153 |
| 151 v8::Local<v8::Object> WindowProxy::releaseGlobal() { | 154 v8::Local<v8::Object> WindowProxy::releaseGlobal() { |
| 152 ASSERT(!isContextInitialized()); | 155 ASSERT(!isContextInitialized()); |
| 153 // If a ScriptState was created, the context was initialized at some point. | 156 // 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 clearFor
Navigation(). | 157 // Make sure the global object was detached from the proxy by calling |
| 158 // clearForNavigation(). |
| 155 if (m_scriptState) | 159 if (m_scriptState) |
| 156 ASSERT(m_scriptState->isGlobalObjectDetached()); | 160 ASSERT(m_scriptState->isGlobalObjectDetached()); |
| 157 v8::Local<v8::Object> global = m_global.newLocal(m_isolate); | 161 v8::Local<v8::Object> global = m_global.newLocal(m_isolate); |
| 158 m_global.clear(); | 162 m_global.clear(); |
| 159 return global; | 163 return global; |
| 160 } | 164 } |
| 161 | 165 |
| 162 void WindowProxy::setGlobal(v8::Local<v8::Object> global) { | 166 void WindowProxy::setGlobal(v8::Local<v8::Object> global) { |
| 163 m_global.set(m_isolate, global); | 167 m_global.set(m_isolate, global); |
| 164 | 168 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 LocalFrame* frame = toLocalFrame(m_frame); | 273 LocalFrame* frame = toLocalFrame(m_frame); |
| 270 MainThreadDebugger::instance()->contextCreated(m_scriptState.get(), frame, | 274 MainThreadDebugger::instance()->contextCreated(m_scriptState.get(), frame, |
| 271 origin); | 275 origin); |
| 272 frame->loader().client()->didCreateScriptContext( | 276 frame->loader().client()->didCreateScriptContext( |
| 273 context, m_world->extensionGroup(), m_world->worldId()); | 277 context, m_world->extensionGroup(), m_world->worldId()); |
| 274 } | 278 } |
| 275 return true; | 279 return true; |
| 276 } | 280 } |
| 277 | 281 |
| 278 void WindowProxy::createContext() { | 282 void WindowProxy::createContext() { |
| 279 // FIXME: This should be a null check of m_frame->client(), but there are stil
l some edge cases | 283 // FIXME: This should be a null check of m_frame->client(), but there are |
| 284 // still some edge cases |
| 280 // that this fails to catch during frame detach. | 285 // that this fails to catch during frame detach. |
| 281 if (m_frame->isLocalFrame() && | 286 if (m_frame->isLocalFrame() && |
| 282 !toLocalFrame(m_frame)->loader().documentLoader()) | 287 !toLocalFrame(m_frame)->loader().documentLoader()) |
| 283 return; | 288 return; |
| 284 | 289 |
| 285 // Create a new v8::Context with the window object as the global object | 290 // Create a new v8::Context with the window object as the global object |
| 286 // (aka the inner global). Reuse the global proxy object (aka the outer | 291 // (aka the inner global). Reuse the global proxy object (aka the outer |
| 287 // global) if it already exists. See the comments in | 292 // global) if it already exists. See the comments in |
| 288 // setupWindowPrototypeChain for the structure of the prototype chain of | 293 // setupWindowPrototypeChain for the structure of the prototype chain of |
| 289 // the global object. | 294 // the global object. |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 toV8(frame->document(), context->Global(), context->GetIsolate()); | 411 toV8(frame->document(), context->Global(), context->GetIsolate()); |
| 407 if (documentWrapper.IsEmpty()) | 412 if (documentWrapper.IsEmpty()) |
| 408 return; | 413 return; |
| 409 ASSERT(documentWrapper == m_document.newLocal(m_isolate) || | 414 ASSERT(documentWrapper == m_document.newLocal(m_isolate) || |
| 410 m_document.isEmpty()); | 415 m_document.isEmpty()); |
| 411 if (m_document.isEmpty()) | 416 if (m_document.isEmpty()) |
| 412 updateDocumentWrapper(v8::Local<v8::Object>::Cast(documentWrapper)); | 417 updateDocumentWrapper(v8::Local<v8::Object>::Cast(documentWrapper)); |
| 413 checkDocumentWrapper(m_document.newLocal(m_isolate), frame->document()); | 418 checkDocumentWrapper(m_document.newLocal(m_isolate), frame->document()); |
| 414 | 419 |
| 415 ASSERT(documentWrapper->IsObject()); | 420 ASSERT(documentWrapper->IsObject()); |
| 416 // TODO(jochen): Don't replace the accessor with a data value. We need a way t
o tell v8 that the accessor's return value won't change after this point. | 421 // TODO(jochen): Don't replace the accessor with a data value. We need a way |
| 422 // to tell v8 that the accessor's return value won't change after this point. |
| 417 if (!v8CallBoolean(context->Global()->ForceSet( | 423 if (!v8CallBoolean(context->Global()->ForceSet( |
| 418 context, v8AtomicString(m_isolate, "document"), documentWrapper, | 424 context, v8AtomicString(m_isolate, "document"), documentWrapper, |
| 419 static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)))) | 425 static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)))) |
| 420 return; | 426 return; |
| 421 } | 427 } |
| 422 | 428 |
| 423 void WindowProxy::updateActivityLogger() { | 429 void WindowProxy::updateActivityLogger() { |
| 424 m_scriptState->perContextData()->setActivityLogger( | 430 m_scriptState->perContextData()->setActivityLogger( |
| 425 V8DOMActivityLogger::activityLogger( | 431 V8DOMActivityLogger::activityLogger( |
| 426 m_world->worldId(), | 432 m_world->worldId(), |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 v8String(m_isolate, name)); | 577 v8String(m_isolate, name)); |
| 572 } | 578 } |
| 573 | 579 |
| 574 void WindowProxy::updateSecurityOrigin(SecurityOrigin* origin) { | 580 void WindowProxy::updateSecurityOrigin(SecurityOrigin* origin) { |
| 575 if (!isContextInitialized()) | 581 if (!isContextInitialized()) |
| 576 return; | 582 return; |
| 577 setSecurityToken(origin); | 583 setSecurityToken(origin); |
| 578 } | 584 } |
| 579 | 585 |
| 580 } // namespace blink | 586 } // namespace blink |
| OLD | NEW |