[SCM] WebKit Debian packaging branch, webkit-1.2, updated. upstream/1.1.90-6072-g9a69373

barraclough at apple.com barraclough at apple.com
Wed Apr 7 23:29:46 UTC 2010


The following commit has been merged in the webkit-1.2 branch:
commit ace5339cc93bd421fd19460b4ac905f7ed350e9b
Author: barraclough at apple.com <barraclough at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Nov 10 22:21:54 2009 +0000

    Fix back/forwards cache with JSC isolated worlds.
    https://bugs.webkit.org/show_bug.cgi?id=31310
    <rdar://problem/7328111> Cached back navigation doesn't restore global object in extension isolated world
    
    Patch by Gavin Barraclough <barraclough at apple.com> on 2009-11-10
    Reviewed by Geoff Garen.
    
    Store the global object for all worlds, not just the normal world.
    Also maintain bidirectional weak references between the ScriptCachedFrameData and the DOMWrapperWorld,
    so we can forget global objects if a world goes away.
    
    * bindings/js/JSDOMBinding.cpp:
    (WebCore::DOMWrapperWorld::~DOMWrapperWorld):
    * bindings/js/JSDOMBinding.h:
    (WebCore::DOMWrapperWorld::rememberScriptCachedFrameData):
    (WebCore::DOMWrapperWorld::forgetScriptCachedFrameData):
    * bindings/js/ScriptCachedFrameData.cpp:
    (WebCore::ScriptCachedFrameData::ScriptCachedFrameData):
    (WebCore::ScriptCachedFrameData::forgetWorld):
    (WebCore::ScriptCachedFrameData::domWindow):
    (WebCore::ScriptCachedFrameData::restore):
    (WebCore::ScriptCachedFrameData::clear):
    * bindings/js/ScriptCachedFrameData.h:
    * bindings/js/ScriptController.h:
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@50767 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 946216e..873cc93 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,29 @@
+2009-11-10  Gavin Barraclough  <barraclough at apple.com>
+
+        Reviewed by Geoff Garen.
+
+        Fix back/forwards cache with JSC isolated worlds.
+        https://bugs.webkit.org/show_bug.cgi?id=31310
+        <rdar://problem/7328111> Cached back navigation doesn't restore global object in extension isolated world
+
+        Store the global object for all worlds, not just the normal world.
+        Also maintain bidirectional weak references between the ScriptCachedFrameData and the DOMWrapperWorld,
+        so we can forget global objects if a world goes away.
+
+        * bindings/js/JSDOMBinding.cpp:
+        (WebCore::DOMWrapperWorld::~DOMWrapperWorld):
+        * bindings/js/JSDOMBinding.h:
+        (WebCore::DOMWrapperWorld::rememberScriptCachedFrameData):
+        (WebCore::DOMWrapperWorld::forgetScriptCachedFrameData):
+        * bindings/js/ScriptCachedFrameData.cpp:
+        (WebCore::ScriptCachedFrameData::ScriptCachedFrameData):
+        (WebCore::ScriptCachedFrameData::forgetWorld):
+        (WebCore::ScriptCachedFrameData::domWindow):
+        (WebCore::ScriptCachedFrameData::restore):
+        (WebCore::ScriptCachedFrameData::clear):
+        * bindings/js/ScriptCachedFrameData.h:
+        * bindings/js/ScriptController.h:
+
 2009-11-10  Csaba Osztrogonác  <ossy at webkit.org>
 
         [Qt] Unreviewed buildfix after r50760.
diff --git a/WebCore/bindings/js/JSDOMBinding.cpp b/WebCore/bindings/js/JSDOMBinding.cpp
index ef69c7b..26427f0 100644
--- a/WebCore/bindings/js/JSDOMBinding.cpp
+++ b/WebCore/bindings/js/JSDOMBinding.cpp
@@ -45,6 +45,7 @@
 #include "KURL.h"
 #include "MessagePort.h"
 #include "RangeException.h"
+#include "ScriptCachedFrameData.h"
 #include "ScriptController.h"
 #include "Settings.h"
 #include "XMLHttpRequestException.h"
@@ -169,6 +170,8 @@ DOMWrapperWorld::~DOMWrapperWorld()
         forgetWorldOfDOMNodesForDocument(*iter, this);
     for (HashSet<ScriptController*>::iterator iter = scriptControllersWithShells.begin(); iter != scriptControllersWithShells.end(); ++iter)
         (*iter)->forgetWorld(this);
+    for (HashSet<ScriptCachedFrameData*>::iterator iter = backForwardCachesWithShells.begin(); iter != backForwardCachesWithShells.end(); ++iter)
+        (*iter)->forgetWorld(this);
 }
 
 EnterDOMWrapperWorld::EnterDOMWrapperWorld(JSC::JSGlobalData& globalData, DOMWrapperWorld* isolatedWorld)
diff --git a/WebCore/bindings/js/JSDOMBinding.h b/WebCore/bindings/js/JSDOMBinding.h
index ba41d85..c3d75d1 100644
--- a/WebCore/bindings/js/JSDOMBinding.h
+++ b/WebCore/bindings/js/JSDOMBinding.h
@@ -42,6 +42,7 @@ namespace WebCore {
     class Node;
     class String;
     class ScriptController;
+    class ScriptCachedFrameData;
 
     typedef int ExceptionCode;
 
@@ -149,6 +150,8 @@ namespace WebCore {
         void forgetDocument(Document* document) { documentsWithWrappers.remove(document); }
         void rememberScriptController(ScriptController* scriptController) { scriptControllersWithShells.add(scriptController); }
         void forgetScriptController(ScriptController* scriptController) { scriptControllersWithShells.remove(scriptController); }
+        void rememberScriptCachedFrameData(ScriptCachedFrameData* backForwardCache) { backForwardCachesWithShells.add(backForwardCache); }
+        void forgetScriptCachedFrameData(ScriptCachedFrameData* backForwardCache) { backForwardCachesWithShells.remove(backForwardCache); }
 
         // FIXME: can we make this private?
         DOMObjectWrapperMap m_wrappers;
@@ -157,6 +160,7 @@ namespace WebCore {
         JSC::JSGlobalData* m_globalData;
         HashSet<Document*> documentsWithWrappers;
         HashSet<ScriptController*> scriptControllersWithShells;
+        HashSet<ScriptCachedFrameData*> backForwardCachesWithShells;
     };
 
     // Map from static HashTable instances to per-GlobalData ones.
diff --git a/WebCore/bindings/js/ScriptCachedFrameData.cpp b/WebCore/bindings/js/ScriptCachedFrameData.cpp
index e01324e..1908102 100644
--- a/WebCore/bindings/js/ScriptCachedFrameData.cpp
+++ b/WebCore/bindings/js/ScriptCachedFrameData.cpp
@@ -44,19 +44,35 @@ using namespace JSC;
 namespace WebCore {
 
 ScriptCachedFrameData::ScriptCachedFrameData(Frame* frame)
+    : m_domWindow(0)
 {
     JSLock lock(SilenceAssertionsOnly);
 
     ScriptController* scriptController = frame->script();
-    // FIXME: explicitly save and restore isolated worlds' global objects when using the back/forward cache. <rdar://problem/7328111>
-    if (JSDOMWindowShell* windowShell = scriptController->existingWindowShell(mainThreadNormalWorld())) {
-        m_window = windowShell->window();
-        scriptController->attachDebugger(0);
+    ScriptController::ShellMap& windowShells = scriptController->m_windowShells;
+
+    ScriptController::ShellMap::iterator windowShellsEnd = windowShells.end();
+    for (ScriptController::ShellMap::iterator iter = windowShells.begin(); iter != windowShellsEnd; ++iter) {
+        DOMWrapperWorld* world = iter->first;
+        JSDOMWindow* window = iter->second->window();
+        
+        world->rememberScriptCachedFrameData(this);
+        m_windows.add(world, window);
+
+        m_domWindow = window->impl();
     }
+
+    scriptController->attachDebugger(0);
 }
 
-DOMWindow* ScriptCachedFrameData::domWindow() const {
-    return m_window ? m_window->impl() : 0;
+void ScriptCachedFrameData::forgetWorld(DOMWrapperWorld* world)
+{
+    m_windows.remove(world);
+}
+
+DOMWindow* ScriptCachedFrameData::domWindow() const
+{
+    return m_domWindow;
 }
 
 ScriptCachedFrameData::~ScriptCachedFrameData()
@@ -71,26 +87,39 @@ void ScriptCachedFrameData::restore(Frame* frame)
     JSLock lock(SilenceAssertionsOnly);
 
     ScriptController* scriptController = frame->script();
-    // FIXME: explicitly save and restore isolated worlds' global objects when using the back/forward cache. <rdar://problem/7328111>
-    if (JSDOMWindowShell* windowShell = scriptController->existingWindowShell(mainThreadNormalWorld())) {
-        if (m_window)
-            windowShell->setWindow(m_window.get());
+    ScriptController::ShellMap& windowShells = scriptController->m_windowShells;
+
+    ScriptController::ShellMap::iterator windowShellsEnd = windowShells.end();
+    for (ScriptController::ShellMap::iterator iter = windowShells.begin(); iter != windowShellsEnd; ++iter) {
+        DOMWrapperWorld* world = iter->first;
+        JSDOMWindowShell* windowShell = iter->second.get();
+
+        if (JSDOMWindow* window = m_windows.get(world))
+            windowShell->setWindow(window);
         else {
             windowShell->setWindow(frame->domWindow());
-            scriptController->attachDebugger(page->debugger());
-            windowShell->window()->setProfileGroup(page->group().identifier());
+            if (world == debuggerWorld()) {
+                scriptController->attachDebugger(page->debugger());
+                windowShell->window()->setProfileGroup(page->group().identifier());
+            }
         }
     }
 }
 
 void ScriptCachedFrameData::clear()
 {
+    if (m_windows.isEmpty())
+        return;
+
     JSLock lock(SilenceAssertionsOnly);
 
-    if (m_window) {
-        m_window = 0;
-        gcController().garbageCollectSoon();
+    for (JSDOMWindowSet::iterator iter = m_windows.begin(); iter != m_windows.end(); ++iter) {
+        DOMWrapperWorld* world = iter->first;
+        world->forgetScriptCachedFrameData(this);
     }
+
+    m_windows.clear();
+    gcController().garbageCollectSoon();
 }
 
 } // namespace WebCore
diff --git a/WebCore/bindings/js/ScriptCachedFrameData.h b/WebCore/bindings/js/ScriptCachedFrameData.h
index c661f28..21422ba 100644
--- a/WebCore/bindings/js/ScriptCachedFrameData.h
+++ b/WebCore/bindings/js/ScriptCachedFrameData.h
@@ -38,8 +38,11 @@ namespace WebCore {
     class Frame;
     class JSDOMWindow;
     class DOMWindow;
+    class DOMWrapperWorld;
 
     class ScriptCachedFrameData  {
+        typedef HashMap<DOMWrapperWorld*, JSC::ProtectedPtr<JSDOMWindow> > JSDOMWindowSet;
+
     public:
         ScriptCachedFrameData(Frame*);
         ~ScriptCachedFrameData();
@@ -47,9 +50,11 @@ namespace WebCore {
         void restore(Frame*);
         void clear();
         DOMWindow* domWindow() const;
+        void forgetWorld(DOMWrapperWorld*);
 
     private:
-        JSC::ProtectedPtr<JSDOMWindow> m_window;
+        JSDOMWindowSet m_windows;
+        DOMWindow* m_domWindow;
     };
 
 } // namespace WebCore
diff --git a/WebCore/bindings/js/ScriptController.h b/WebCore/bindings/js/ScriptController.h
index f2a497d..0bdc207 100644
--- a/WebCore/bindings/js/ScriptController.h
+++ b/WebCore/bindings/js/ScriptController.h
@@ -63,6 +63,7 @@ class XSSAuditor;
 typedef HashMap<void*, RefPtr<JSC::Bindings::RootObject> > RootObjectMap;
 
 class ScriptController {
+    friend class ScriptCachedFrameData;
     typedef WTF::HashMap<DOMWrapperWorld*, JSC::ProtectedPtr<JSDOMWindowShell> > ShellMap;
 
 public:

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list