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 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 | 223 |
224 if (m_world->isMainWorld()) { | 224 if (m_world->isMainWorld()) { |
225 updateDocument(); | 225 updateDocument(); |
226 if (m_frame->document()) { | 226 if (m_frame->document()) { |
227 setSecurityToken(m_frame->document()->securityOrigin()); | 227 setSecurityToken(m_frame->document()->securityOrigin()); |
228 ContentSecurityPolicy* csp = m_frame->document()->contentSecurityPol
icy(); | 228 ContentSecurityPolicy* csp = m_frame->document()->contentSecurityPol
icy(); |
229 context->AllowCodeGenerationFromStrings(csp->allowEval(0, ContentSec
urityPolicy::SuppressReport)); | 229 context->AllowCodeGenerationFromStrings(csp->allowEval(0, ContentSec
urityPolicy::SuppressReport)); |
230 context->SetErrorMessageForCodeGenerationFromStrings(v8String(m_isol
ate, csp->evalDisabledErrorMessage())); | 230 context->SetErrorMessageForCodeGenerationFromStrings(v8String(m_isol
ate, csp->evalDisabledErrorMessage())); |
231 } | 231 } |
232 } else { | 232 } else { |
233 // Using the default security token means that the canAccess is always | |
234 // called, which is slow. | |
235 // FIXME: Use tokens where possible. This will mean keeping track of all | |
236 // created contexts so that they can all be updated when the | |
237 // document domain | |
238 // changes. | |
239 context->UseDefaultSecurityToken(); | |
240 | |
241 SecurityOrigin* origin = m_world->isolatedWorldSecurityOrigin(); | 233 SecurityOrigin* origin = m_world->isolatedWorldSecurityOrigin(); |
| 234 setSecurityToken(origin); |
242 if (origin && InspectorInstrumentation::hasFrontends()) { | 235 if (origin && InspectorInstrumentation::hasFrontends()) { |
243 InspectorInstrumentation::didCreateIsolatedContext(m_frame, ScriptSt
ate::current(m_isolate), origin); | 236 InspectorInstrumentation::didCreateIsolatedContext(m_frame, ScriptSt
ate::current(m_isolate), origin); |
244 } | 237 } |
245 } | 238 } |
246 m_frame->loader().client()->didCreateScriptContext(context, m_world->extensi
onGroup(), m_world->worldId()); | 239 m_frame->loader().client()->didCreateScriptContext(context, m_world->extensi
onGroup(), m_world->worldId()); |
247 return true; | 240 return true; |
248 } | 241 } |
249 | 242 |
250 void V8WindowShell::createContext() | 243 void V8WindowShell::createContext() |
251 { | 244 { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 { | 362 { |
370 ASSERT(isContextInitialized()); | 363 ASSERT(isContextInitialized()); |
371 if (!m_world->isMainWorld()) | 364 if (!m_world->isMainWorld()) |
372 return; | 365 return; |
373 v8::HandleScope handleScope(m_isolate); | 366 v8::HandleScope handleScope(m_isolate); |
374 m_scriptState->context()->Global()->ForceDelete(v8AtomicString(m_isolate, "d
ocument")); | 367 m_scriptState->context()->Global()->ForceDelete(v8AtomicString(m_isolate, "d
ocument")); |
375 } | 368 } |
376 | 369 |
377 void V8WindowShell::setSecurityToken(SecurityOrigin* origin) | 370 void V8WindowShell::setSecurityToken(SecurityOrigin* origin) |
378 { | 371 { |
379 ASSERT(m_world->isMainWorld()); | |
380 // If two tokens are equal, then the SecurityOrigins canAccess each other. | 372 // If two tokens are equal, then the SecurityOrigins canAccess each other. |
381 // If two tokens are not equal, then we have to call canAccess. | 373 // If two tokens are not equal, then we have to call canAccess. |
382 // Note: we can't use the HTTPOrigin if it was set from the DOM. | 374 // Note: we can't use the HTTPOrigin if it was set from the DOM. |
383 String token; | 375 String token; |
384 // We stick with an empty token if document.domain was modified or if we | 376 // We stick with an empty token if document.domain was modified or if we |
385 // are in the initial empty document, so that we can do a full canAccess | 377 // are in the initial empty document, so that we can do a full canAccess |
386 // check in those cases. | 378 // check in those cases. |
387 if (!origin->domainWasSetInDOM() | 379 bool delaySet = m_world->isMainWorld() |
388 && !m_frame->loader().stateMachine()->isDisplayingInitialEmptyDocument()
) | 380 && (origin->domainWasSetInDOM() |
| 381 || m_frame->loader().stateMachine()->isDisplayingInitialEmptyDocumen
t()); |
| 382 if (origin && !delaySet) |
389 token = origin->toString(); | 383 token = origin->toString(); |
390 | 384 |
391 // An empty or "null" token means we always have to call | 385 // An empty or "null" token means we always have to call |
392 // canAccess. The toString method on securityOrigins returns the | 386 // canAccess. The toString method on securityOrigins returns the |
393 // string "null" for empty security origins and for security | 387 // string "null" for empty security origins and for security |
394 // origins that should only allow access to themselves. In this | 388 // origins that should only allow access to themselves. In this |
395 // case, we use the global object as the security token to avoid | 389 // case, we use the global object as the security token to avoid |
396 // calling canAccess when a script accesses its own objects. | 390 // calling canAccess when a script accesses its own objects. |
397 v8::HandleScope handleScope(m_isolate); | 391 v8::HandleScope handleScope(m_isolate); |
398 v8::Handle<v8::Context> context = m_scriptState->context(); | 392 v8::Handle<v8::Context> context = m_scriptState->context(); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 | 483 |
490 void V8WindowShell::updateSecurityOrigin(SecurityOrigin* origin) | 484 void V8WindowShell::updateSecurityOrigin(SecurityOrigin* origin) |
491 { | 485 { |
492 ASSERT(m_world->isMainWorld()); | 486 ASSERT(m_world->isMainWorld()); |
493 if (!isContextInitialized()) | 487 if (!isContextInitialized()) |
494 return; | 488 return; |
495 setSecurityToken(origin); | 489 setSecurityToken(origin); |
496 } | 490 } |
497 | 491 |
498 } // WebCore | 492 } // WebCore |
OLD | NEW |