Title: [171563] branches/safari-600.1-branch/Source/WebCore

Diff

Modified: branches/safari-600.1-branch/Source/WebCore/ChangeLog (171562 => 171563)


--- branches/safari-600.1-branch/Source/WebCore/ChangeLog	2014-07-25 00:53:50 UTC (rev 171562)
+++ branches/safari-600.1-branch/Source/WebCore/ChangeLog	2014-07-25 00:57:39 UTC (rev 171563)
@@ -1,5 +1,33 @@
 2014-07-24  Lucas Forschler  <lforsch...@apple.com>
 
+        Merge r171505
+
+    2014-07-23  Joseph Pecoraro  <pecor...@apple.com>
+
+            ScriptController::updateDocument ASSERT mutating map while iterating map
+            https://bugs.webkit.org/show_bug.cgi?id=135211
+
+            Reviewed by Oliver Hunt.
+
+            Avoid iterating over m_windowShells in more places. This prevents
+            the possibility of a collection during JSC allocation which might
+            cause a mutation to m_windowShells (HTMLMediaElement destruction).
+
+            Have ScriptController defriend ScriptCachedFrameData by providing
+            a getter for the list of window shells.
+
+            * bindings/js/ScriptCachedFrameData.cpp:
+            (WebCore::ScriptCachedFrameData::ScriptCachedFrameData):
+            (WebCore::ScriptCachedFrameData::restore):
+            * bindings/js/ScriptController.cpp:
+            (WebCore::ScriptController::windowShells):
+            (WebCore::ScriptController::clearWindowShell):
+            (WebCore::ScriptController::attachDebugger):
+            (WebCore::ScriptController::updateDocument):
+            * bindings/js/ScriptController.h:
+
+2014-07-24  Lucas Forschler  <lforsch...@apple.com>
+
         Merge r171554
 
     2014-07-24  Dan Bernstein  <m...@apple.com>

Modified: branches/safari-600.1-branch/Source/WebCore/bindings/js/ScriptCachedFrameData.cpp (171562 => 171563)


--- branches/safari-600.1-branch/Source/WebCore/bindings/js/ScriptCachedFrameData.cpp	2014-07-25 00:53:50 UTC (rev 171562)
+++ branches/safari-600.1-branch/Source/WebCore/bindings/js/ScriptCachedFrameData.cpp	2014-07-25 00:57:39 UTC (rev 171563)
@@ -51,12 +51,12 @@
     JSLockHolder lock(JSDOMWindowBase::commonVM());
 
     ScriptController& scriptController = frame.script();
-    ScriptController::ShellMap& windowShells = scriptController.m_windowShells;
+    Vector<JSC::Strong<JSDOMWindowShell>> windowShells = scriptController.windowShells();
 
-    ScriptController::ShellMap::iterator windowShellsEnd = windowShells.end();
-    for (ScriptController::ShellMap::iterator iter = windowShells.begin(); iter != windowShellsEnd; ++iter) {
-        JSDOMWindow* window = iter->value->window();
-        m_windows.add(iter->key.get(), Strong<JSDOMWindow>(window->vm(), window));
+    for (size_t i = 0; i < windowShells.size(); ++i) {
+        JSDOMWindowShell* windowShell = windowShells[i].get();
+        JSDOMWindow* window = windowShell->window();
+        m_windows.add(&windowShell->world(), Strong<JSDOMWindow>(window->vm(), window));
         window->setConsoleClient(nullptr);
     }
 
@@ -74,11 +74,11 @@
 
     Page* page = frame.page();
     ScriptController& scriptController = frame.script();
-    ScriptController::ShellMap& windowShells = scriptController.m_windowShells;
+    Vector<JSC::Strong<JSDOMWindowShell>> windowShells = scriptController.windowShells();
 
-    for (auto it = windowShells.begin(), end = windowShells.end(); it != end; ++it) {
-        DOMWrapperWorld* world = it->key.get();
-        JSDOMWindowShell* windowShell = it->value.get();
+    for (size_t i = 0; i < windowShells.size(); ++i) {
+        JSDOMWindowShell* windowShell = windowShells[i].get();
+        DOMWrapperWorld* world = &windowShell->world();
 
         if (JSDOMWindow* window = m_windows.get(world).get())
             windowShell->setWindow(window->vm(), window);

Modified: branches/safari-600.1-branch/Source/WebCore/bindings/js/ScriptController.cpp (171562 => 171563)


--- branches/safari-600.1-branch/Source/WebCore/bindings/js/ScriptController.cpp	2014-07-25 00:53:50 UTC (rev 171562)
+++ branches/safari-600.1-branch/Source/WebCore/bindings/js/ScriptController.cpp	2014-07-25 00:57:39 UTC (rev 171563)
@@ -170,6 +170,13 @@
     return DOMWrapperWorld::create(JSDOMWindow::commonVM());
 }
 
+Vector<JSC::Strong<JSDOMWindowShell>> ScriptController::windowShells()
+{
+    Vector<JSC::Strong<JSDOMWindowShell>> windowShells;
+    copyValuesToVector(m_windowShells, windowShells);
+    return windowShells;
+}
+
 void ScriptController::getAllWorlds(Vector<Ref<DOMWrapperWorld>>& worlds)
 {
     static_cast<WebCoreJSClientData*>(JSDOMWindow::commonVM().clientData)->getAllWorlds(worlds);
@@ -182,9 +189,7 @@
 
     JSLockHolder lock(JSDOMWindowBase::commonVM());
 
-    Vector<JSC::Strong<JSDOMWindowShell>> windowShells;
-    copyValuesToVector(m_windowShells, windowShells);
-
+    Vector<JSC::Strong<JSDOMWindowShell>> windowShells = this->windowShells();
     for (size_t i = 0; i < windowShells.size(); ++i) {
         JSDOMWindowShell* windowShell = windowShells[i].get();
 
@@ -288,8 +293,9 @@
 
 void ScriptController::attachDebugger(JSC::Debugger* debugger)
 {
-    for (ShellMap::iterator iter = m_windowShells.begin(); iter != m_windowShells.end(); ++iter)
-        attachDebugger(iter->value.get(), debugger);
+    Vector<JSC::Strong<JSDOMWindowShell>> windowShells = this->windowShells();
+    for (size_t i = 0; i < windowShells.size(); ++i)
+        attachDebugger(windowShells[i].get(), debugger);
 }
 
 void ScriptController::attachDebugger(JSDOMWindowShell* shell, JSC::Debugger* debugger)
@@ -306,9 +312,11 @@
 
 void ScriptController::updateDocument()
 {
-    for (ShellMap::iterator iter = m_windowShells.begin(); iter != m_windowShells.end(); ++iter) {
-        JSLockHolder lock(iter->key->vm());
-        iter->value->window()->updateDocument();
+    Vector<JSC::Strong<JSDOMWindowShell>> windowShells = this->windowShells();
+    for (size_t i = 0; i < windowShells.size(); ++i) {
+        JSDOMWindowShell* windowShell = windowShells[i].get();
+        JSLockHolder lock(windowShell->world().vm());
+        windowShell->window()->updateDocument();
     }
 }
 

Modified: branches/safari-600.1-branch/Source/WebCore/bindings/js/ScriptController.h (171562 => 171563)


--- branches/safari-600.1-branch/Source/WebCore/bindings/js/ScriptController.h	2014-07-25 00:53:50 UTC (rev 171562)
+++ branches/safari-600.1-branch/Source/WebCore/bindings/js/ScriptController.h	2014-07-25 00:57:39 UTC (rev 171563)
@@ -71,7 +71,6 @@
 class ScriptController {
     WTF_MAKE_FAST_ALLOCATED;
 
-    friend class ScriptCachedFrameData;
     typedef HashMap<RefPtr<DOMWrapperWorld>, JSC::Strong<JSDOMWindowShell>> ShellMap;
 
 public:
@@ -83,6 +82,8 @@
     JSDOMWindowShell* createWindowShell(DOMWrapperWorld&);
     void destroyWindowShell(DOMWrapperWorld&);
 
+    Vector<JSC::Strong<JSDOMWindowShell>> windowShells();
+
     JSDOMWindowShell* windowShell(DOMWrapperWorld& world)
     {
         ShellMap::iterator iter = m_windowShells.find(&world);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to