| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008, 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2008, 2009 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2009 Apple Inc. All rights reserved. | 3 * Copyright (C) 2009 Apple Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 return result; | 207 return result; |
| 208 } | 208 } |
| 209 | 209 |
| 210 bool ScriptController::initializeMainWorld() | 210 bool ScriptController::initializeMainWorld() |
| 211 { | 211 { |
| 212 if (m_windowShell->isContextInitialized()) | 212 if (m_windowShell->isContextInitialized()) |
| 213 return false; | 213 return false; |
| 214 return windowShell(DOMWrapperWorld::mainWorld())->isContextInitialized(); | 214 return windowShell(DOMWrapperWorld::mainWorld())->isContextInitialized(); |
| 215 } | 215 } |
| 216 | 216 |
| 217 V8WindowShell* ScriptController::existingWindowShell(DOMWrapperWorld* world) | 217 V8WindowShell* ScriptController::existingWindowShell(DOMWrapperWorld& world) |
| 218 { | 218 { |
| 219 ASSERT(world); | 219 if (world.isMainWorld()) |
| 220 | |
| 221 if (world->isMainWorld()) | |
| 222 return m_windowShell->isContextInitialized() ? m_windowShell.get() : 0; | 220 return m_windowShell->isContextInitialized() ? m_windowShell.get() : 0; |
| 223 | 221 |
| 224 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world->worldId()); | 222 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId()); |
| 225 if (iter == m_isolatedWorlds.end()) | 223 if (iter == m_isolatedWorlds.end()) |
| 226 return 0; | 224 return 0; |
| 227 return iter->value->isContextInitialized() ? iter->value.get() : 0; | 225 return iter->value->isContextInitialized() ? iter->value.get() : 0; |
| 228 } | 226 } |
| 229 | 227 |
| 230 V8WindowShell* ScriptController::windowShell(DOMWrapperWorld* world) | 228 V8WindowShell* ScriptController::windowShell(DOMWrapperWorld& world) |
| 231 { | 229 { |
| 232 ASSERT(world); | |
| 233 | |
| 234 V8WindowShell* shell = 0; | 230 V8WindowShell* shell = 0; |
| 235 if (world->isMainWorld()) | 231 if (world.isMainWorld()) |
| 236 shell = m_windowShell.get(); | 232 shell = m_windowShell.get(); |
| 237 else { | 233 else { |
| 238 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world->worldId()
); | 234 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId())
; |
| 239 if (iter != m_isolatedWorlds.end()) | 235 if (iter != m_isolatedWorlds.end()) |
| 240 shell = iter->value.get(); | 236 shell = iter->value.get(); |
| 241 else { | 237 else { |
| 242 OwnPtr<V8WindowShell> isolatedWorldShell = V8WindowShell::create(m_f
rame, world, m_isolate); | 238 OwnPtr<V8WindowShell> isolatedWorldShell = V8WindowShell::create(m_f
rame, world, m_isolate); |
| 243 shell = isolatedWorldShell.get(); | 239 shell = isolatedWorldShell.get(); |
| 244 m_isolatedWorlds.set(world->worldId(), isolatedWorldShell.release())
; | 240 m_isolatedWorlds.set(world.worldId(), isolatedWorldShell.release()); |
| 245 } | 241 } |
| 246 } | 242 } |
| 247 if (!shell->isContextInitialized() && shell->initializeIfNeeded()) | 243 if (!shell->isContextInitialized() && shell->initializeIfNeeded()) |
| 248 m_frame->loader().dispatchDidClearWindowObjectInWorld(world); | 244 m_frame->loader().dispatchDidClearWindowObjectInWorld(world); |
| 249 return shell; | 245 return shell; |
| 250 } | 246 } |
| 251 | 247 |
| 252 bool ScriptController::shouldBypassMainWorldContentSecurityPolicy() | 248 bool ScriptController::shouldBypassMainWorldContentSecurityPolicy() |
| 253 { | 249 { |
| 254 v8::Handle<v8::Context> context = m_isolate->GetCurrentContext(); | 250 v8::Handle<v8::Context> context = m_isolate->GetCurrentContext(); |
| 255 if (context.IsEmpty() || !toDOMWindow(context)) | 251 if (context.IsEmpty() || !toDOMWindow(context)) |
| 256 return false; | 252 return false; |
| 257 DOMWrapperWorld* world = DOMWrapperWorld::current(m_isolate); | 253 DOMWrapperWorld& world = DOMWrapperWorld::current(m_isolate); |
| 258 return world->isIsolatedWorld() ? world->isolatedWorldHasContentSecurityPoli
cy() : false; | 254 return world.isIsolatedWorld() ? world.isolatedWorldHasContentSecurityPolicy
() : false; |
| 259 } | 255 } |
| 260 | 256 |
| 261 TextPosition ScriptController::eventHandlerPosition() const | 257 TextPosition ScriptController::eventHandlerPosition() const |
| 262 { | 258 { |
| 263 ScriptableDocumentParser* parser = m_frame->document()->scriptableDocumentPa
rser(); | 259 ScriptableDocumentParser* parser = m_frame->document()->scriptableDocumentPa
rser(); |
| 264 if (parser) | 260 if (parser) |
| 265 return parser->textPosition(); | 261 return parser->textPosition(); |
| 266 return TextPosition::minimumPosition(); | 262 return TextPosition::minimumPosition(); |
| 267 } | 263 } |
| 268 | 264 |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 void ScriptController::setCaptureCallStackForUncaughtExceptions(bool value) | 443 void ScriptController::setCaptureCallStackForUncaughtExceptions(bool value) |
| 448 { | 444 { |
| 449 v8::V8::SetCaptureStackTraceForUncaughtExceptions(value, ScriptCallStack::ma
xCallStackSizeToCapture, stackTraceOptions); | 445 v8::V8::SetCaptureStackTraceForUncaughtExceptions(value, ScriptCallStack::ma
xCallStackSizeToCapture, stackTraceOptions); |
| 450 } | 446 } |
| 451 | 447 |
| 452 void ScriptController::collectIsolatedContexts(Vector<std::pair<ScriptState*, Se
curityOrigin*> >& result) | 448 void ScriptController::collectIsolatedContexts(Vector<std::pair<ScriptState*, Se
curityOrigin*> >& result) |
| 453 { | 449 { |
| 454 v8::HandleScope handleScope(m_isolate); | 450 v8::HandleScope handleScope(m_isolate); |
| 455 for (IsolatedWorldMap::iterator it = m_isolatedWorlds.begin(); it != m_isola
tedWorlds.end(); ++it) { | 451 for (IsolatedWorldMap::iterator it = m_isolatedWorlds.begin(); it != m_isola
tedWorlds.end(); ++it) { |
| 456 V8WindowShell* isolatedWorldShell = it->value.get(); | 452 V8WindowShell* isolatedWorldShell = it->value.get(); |
| 457 SecurityOrigin* origin = isolatedWorldShell->world()->isolatedWorldSecur
ityOrigin(); | 453 SecurityOrigin* origin = isolatedWorldShell->world().isolatedWorldSecuri
tyOrigin(); |
| 458 if (!origin) | 454 if (!origin) |
| 459 continue; | 455 continue; |
| 460 v8::Local<v8::Context> v8Context = isolatedWorldShell->context(); | 456 v8::Local<v8::Context> v8Context = isolatedWorldShell->context(); |
| 461 if (v8Context.IsEmpty()) | 457 if (v8Context.IsEmpty()) |
| 462 continue; | 458 continue; |
| 463 ScriptState* scriptState = ScriptState::forContext(v8Context); | 459 ScriptState* scriptState = ScriptState::forContext(v8Context); |
| 464 result.append(std::pair<ScriptState*, SecurityOrigin*>(scriptState, orig
in)); | 460 result.append(std::pair<ScriptState*, SecurityOrigin*>(scriptState, orig
in)); |
| 465 } | 461 } |
| 466 } | 462 } |
| 467 | 463 |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 | 609 |
| 614 void ScriptController::executeScriptInIsolatedWorld(int worldID, const Vector<Sc
riptSourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results) | 610 void ScriptController::executeScriptInIsolatedWorld(int worldID, const Vector<Sc
riptSourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results) |
| 615 { | 611 { |
| 616 ASSERT(worldID > 0); | 612 ASSERT(worldID > 0); |
| 617 | 613 |
| 618 v8::HandleScope handleScope(m_isolate); | 614 v8::HandleScope handleScope(m_isolate); |
| 619 v8::Local<v8::Array> v8Results; | 615 v8::Local<v8::Array> v8Results; |
| 620 { | 616 { |
| 621 v8::EscapableHandleScope evaluateHandleScope(m_isolate); | 617 v8::EscapableHandleScope evaluateHandleScope(m_isolate); |
| 622 RefPtr<DOMWrapperWorld> world = DOMWrapperWorld::ensureIsolatedWorld(wor
ldID, extensionGroup); | 618 RefPtr<DOMWrapperWorld> world = DOMWrapperWorld::ensureIsolatedWorld(wor
ldID, extensionGroup); |
| 623 V8WindowShell* isolatedWorldShell = windowShell(world.get()); | 619 V8WindowShell* isolatedWorldShell = windowShell(*world); |
| 624 | 620 |
| 625 if (!isolatedWorldShell->isContextInitialized()) | 621 if (!isolatedWorldShell->isContextInitialized()) |
| 626 return; | 622 return; |
| 627 | 623 |
| 628 v8::Local<v8::Context> context = isolatedWorldShell->context(); | 624 v8::Local<v8::Context> context = isolatedWorldShell->context(); |
| 629 v8::Context::Scope contextScope(context); | 625 v8::Context::Scope contextScope(context); |
| 630 v8::Local<v8::Array> resultArray = v8::Array::New(m_isolate, sources.siz
e()); | 626 v8::Local<v8::Array> resultArray = v8::Array::New(m_isolate, sources.siz
e()); |
| 631 | 627 |
| 632 for (size_t i = 0; i < sources.size(); ++i) { | 628 for (size_t i = 0; i < sources.size(); ++i) { |
| 633 v8::Local<v8::Value> evaluationResult = executeScriptAndReturnValue(
context, sources[i]); | 629 v8::Local<v8::Value> evaluationResult = executeScriptAndReturnValue(
context, sources[i]); |
| 634 if (evaluationResult.IsEmpty()) | 630 if (evaluationResult.IsEmpty()) |
| 635 evaluationResult = v8::Local<v8::Value>::New(m_isolate, v8::Unde
fined(m_isolate)); | 631 evaluationResult = v8::Local<v8::Value>::New(m_isolate, v8::Unde
fined(m_isolate)); |
| 636 resultArray->Set(i, evaluationResult); | 632 resultArray->Set(i, evaluationResult); |
| 637 } | 633 } |
| 638 | 634 |
| 639 v8Results = evaluateHandleScope.Escape(resultArray); | 635 v8Results = evaluateHandleScope.Escape(resultArray); |
| 640 } | 636 } |
| 641 | 637 |
| 642 if (results && !v8Results.IsEmpty()) { | 638 if (results && !v8Results.IsEmpty()) { |
| 643 for (size_t i = 0; i < v8Results->Length(); ++i) | 639 for (size_t i = 0; i < v8Results->Length(); ++i) |
| 644 results->append(ScriptValue(v8Results->Get(i), m_isolate)); | 640 results->append(ScriptValue(v8Results->Get(i), m_isolate)); |
| 645 } | 641 } |
| 646 } | 642 } |
| 647 | 643 |
| 648 } // namespace WebCore | 644 } // namespace WebCore |
| OLD | NEW |