Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: Source/bindings/v8/ScriptController.cpp

Issue 13954010: Eliminate "temporary" and "uninitialized" isolated worlds (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 return ScriptValue(object); 319 return ScriptValue(object);
320 } 320 }
321 321
322 bool ScriptController::initializeMainWorld() 322 bool ScriptController::initializeMainWorld()
323 { 323 {
324 if (m_windowShell->isContextInitialized()) 324 if (m_windowShell->isContextInitialized())
325 return false; 325 return false;
326 return windowShell(mainThreadNormalWorld())->isContextInitialized(); 326 return windowShell(mainThreadNormalWorld())->isContextInitialized();
327 } 327 }
328 328
329 // FIXME: Remove this function. There is currently an issue with the inspector r elated to the call to dispatchDidClearWindowObjectInWorld in ScriptController::w indowShell.
330 static DOMWrapperWorld* existingWindowShellWorkaroundWorld()
331 {
332 DEFINE_STATIC_LOCAL(RefPtr<DOMWrapperWorld>, world, (DOMWrapperWorld::create UninitializedWorld()));
333 return world.get();
334 }
335
336 V8DOMWindowShell* ScriptController::existingWindowShell(DOMWrapperWorld* world) 329 V8DOMWindowShell* ScriptController::existingWindowShell(DOMWrapperWorld* world)
337 { 330 {
338 ASSERT(world); 331 ASSERT(world);
339 332
340 if (world->isMainWorld()) 333 if (world->isMainWorld())
341 return m_windowShell->isContextInitialized() ? m_windowShell.get() : 0; 334 return m_windowShell->isContextInitialized() ? m_windowShell.get() : 0;
342 335
343 // FIXME: Remove this block. See comment with existingWindowShellWorkaroundW orld(). 336 // FIXME: Remove this block. See comment with existingWindowShellWorkaroundW orld().
344 if (world->worldId() == DOMWrapperWorld::uninitializedWorldId) { 337 if (world == existingWindowShellWorkaroundWorld())
345 ASSERT(world == existingWindowShellWorkaroundWorld());
346 return m_windowShell.get(); 338 return m_windowShell.get();
347 }
348 339
349 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world->worldId()); 340 IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world->worldId());
350 if (iter == m_isolatedWorlds.end()) 341 if (iter == m_isolatedWorlds.end())
351 return 0; 342 return 0;
352 return iter->value->isContextInitialized() ? iter->value.get() : 0; 343 return iter->value->isContextInitialized() ? iter->value.get() : 0;
353 } 344 }
354 345
355 V8DOMWindowShell* ScriptController::windowShell(DOMWrapperWorld* world) 346 V8DOMWindowShell* ScriptController::windowShell(DOMWrapperWorld* world)
356 { 347 {
357 ASSERT(world); 348 ASSERT(world);
(...skipping 16 matching lines...) Expand all
374 // FIXME: Remove this if clause. See comment with existingWindowShel lWorkaroundWorld(). 365 // FIXME: Remove this if clause. See comment with existingWindowShel lWorkaroundWorld().
375 m_frame->loader()->dispatchDidClearWindowObjectInWorld(existingWindo wShellWorkaroundWorld()); 366 m_frame->loader()->dispatchDidClearWindowObjectInWorld(existingWindo wShellWorkaroundWorld());
376 } else 367 } else
377 m_frame->loader()->dispatchDidClearWindowObjectInWorld(world); 368 m_frame->loader()->dispatchDidClearWindowObjectInWorld(world);
378 } 369 }
379 return shell; 370 return shell;
380 } 371 }
381 372
382 void ScriptController::evaluateInIsolatedWorld(int worldID, const Vector<ScriptS ourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results) 373 void ScriptController::evaluateInIsolatedWorld(int worldID, const Vector<ScriptS ourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results)
383 { 374 {
384 // Except in the test runner, worldID should be non 0 as it conflicts with t he mainWorldId. 375 ASSERT(worldID > 0);
385 // FIXME: Change the test runner to perform this swap and make this an ASSER T.
386 if (UNLIKELY(!worldID))
387 worldID = DOMWrapperWorld::uninitializedWorldId;
388 376
389 v8::HandleScope handleScope; 377 v8::HandleScope handleScope;
390 v8::Local<v8::Array> v8Results; 378 v8::Local<v8::Array> v8Results;
391 { 379 {
392 v8::HandleScope evaluateHandleScope; 380 v8::HandleScope evaluateHandleScope;
393 RefPtr<DOMWrapperWorld> world = DOMWrapperWorld::ensureIsolatedWorld(wor ldID, extensionGroup); 381 RefPtr<DOMWrapperWorld> world = DOMWrapperWorld::ensureIsolatedWorld(wor ldID, extensionGroup);
394 V8DOMWindowShell* isolatedWorldShell = windowShell(world.get()); 382 V8DOMWindowShell* isolatedWorldShell = windowShell(world.get());
395 383
396 if (!isolatedWorldShell->isContextInitialized()) 384 if (!isolatedWorldShell->isContextInitialized())
397 return; 385 return;
398 386
399 v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolatedWor ldShell->context()); 387 v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolatedWor ldShell->context());
400 v8::Context::Scope contextScope(context); 388 v8::Context::Scope contextScope(context);
401 v8::Local<v8::Array> resultArray = v8::Array::New(sources.size()); 389 v8::Local<v8::Array> resultArray = v8::Array::New(sources.size());
402 390
403 for (size_t i = 0; i < sources.size(); ++i) { 391 for (size_t i = 0; i < sources.size(); ++i) {
404 v8::Local<v8::Value> evaluationResult = compileAndRunScript(sources[ i]); 392 v8::Local<v8::Value> evaluationResult = compileAndRunScript(sources[ i]);
405 if (evaluationResult.IsEmpty()) 393 if (evaluationResult.IsEmpty())
406 evaluationResult = v8::Local<v8::Value>::New(v8::Undefined()); 394 evaluationResult = v8::Local<v8::Value>::New(v8::Undefined());
407 resultArray->Set(i, evaluationResult); 395 resultArray->Set(i, evaluationResult);
408 } 396 }
409 397
410 // Mark temporary shell for weak destruction.
411 if (worldID == DOMWrapperWorld::uninitializedWorldId) {
412 isolatedWorldShell->destroyIsolatedShell();
413 m_isolatedWorlds.remove(world->worldId());
414 }
415
416 v8Results = evaluateHandleScope.Close(resultArray); 398 v8Results = evaluateHandleScope.Close(resultArray);
417 } 399 }
418 400
419 if (results && !v8Results.IsEmpty()) { 401 if (results && !v8Results.IsEmpty()) {
420 for (size_t i = 0; i < v8Results->Length(); ++i) 402 for (size_t i = 0; i < v8Results->Length(); ++i)
421 results->append(ScriptValue(v8Results->Get(i))); 403 results->append(ScriptValue(v8Results->Get(i)));
422 } 404 }
423 } 405 }
424 406
425 bool ScriptController::shouldBypassMainWorldContentSecurityPolicy() 407 bool ScriptController::shouldBypassMainWorldContentSecurityPolicy()
(...skipping 30 matching lines...) Expand all
456 if (!isolatedWorld) 438 if (!isolatedWorld)
457 return contextForWorld(this, mainThreadNormalWorld()); 439 return contextForWorld(this, mainThreadNormalWorld());
458 440
459 Frame* frame = toFrameIfNotDetached(context); 441 Frame* frame = toFrameIfNotDetached(context);
460 if (!m_frame) 442 if (!m_frame)
461 return v8::Local<v8::Context>(); 443 return v8::Local<v8::Context>();
462 444
463 if (m_frame == frame) 445 if (m_frame == frame)
464 return v8::Local<v8::Context>::New(context); 446 return v8::Local<v8::Context>::New(context);
465 447
466 // FIXME: Need to handle weak isolated worlds correctly.
467 if (isolatedWorld->createdFromUnitializedWorld())
468 return v8::Local<v8::Context>();
469
470 return contextForWorld(this, isolatedWorld); 448 return contextForWorld(this, isolatedWorld);
471 } 449 }
472 450
473 v8::Local<v8::Context> ScriptController::mainWorldContext() 451 v8::Local<v8::Context> ScriptController::mainWorldContext()
474 { 452 {
475 return contextForWorld(this, mainThreadNormalWorld()); 453 return contextForWorld(this, mainThreadNormalWorld());
476 } 454 }
477 455
478 v8::Local<v8::Context> ScriptController::mainWorldContext(Frame* frame) 456 v8::Local<v8::Context> ScriptController::mainWorldContext(Frame* frame)
479 { 457 {
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 790
813 // DocumentWriter::replaceDocument can cause the DocumentLoader to get d eref'ed and possible destroyed, 791 // DocumentWriter::replaceDocument can cause the DocumentLoader to get d eref'ed and possible destroyed,
814 // so protect it with a RefPtr. 792 // so protect it with a RefPtr.
815 if (RefPtr<DocumentLoader> loader = m_frame->document()->loader()) 793 if (RefPtr<DocumentLoader> loader = m_frame->document()->loader())
816 loader->writer()->replaceDocument(scriptResult, ownerDocument.get()) ; 794 loader->writer()->replaceDocument(scriptResult, ownerDocument.get()) ;
817 } 795 }
818 return true; 796 return true;
819 } 797 }
820 798
821 } // namespace WebCore 799 } // namespace WebCore
OLDNEW
« Source/bindings/v8/DOMWrapperWorld.cpp ('K') | « Source/bindings/v8/ScriptController.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698