Home | History | Annotate | Download | only in js
      1 /*
      2  *  Copyright (C) 1999-2001 Harri Porten (porten (at) kde.org)
      3  *  Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Apple Inc. All rights reserved.
      4  *  Copyright (C) 2007 Samuel Weinig <sam (at) webkit.org>
      5  *  Copyright (C) 2009 Google, Inc. All rights reserved.
      6  *
      7  *  This library is free software; you can redistribute it and/or
      8  *  modify it under the terms of the GNU Lesser General Public
      9  *  License as published by the Free Software Foundation; either
     10  *  version 2 of the License, or (at your option) any later version.
     11  *
     12  *  This library is distributed in the hope that it will be useful,
     13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15  *  Lesser General Public License for more details.
     16  *
     17  *  You should have received a copy of the GNU Lesser General Public
     18  *  License along with this library; if not, write to the Free Software
     19  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     20  */
     21 
     22 #ifndef DOMWrapperWorld_h
     23 #define DOMWrapperWorld_h
     24 
     25 #include "JSDOMGlobalObject.h"
     26 #include <heap/Weak.h>
     27 #include <runtime/WeakGCMap.h>
     28 #include <wtf/Forward.h>
     29 
     30 namespace WebCore {
     31 
     32 class JSDOMWrapper;
     33 class ScriptController;
     34 
     35 typedef HashMap<void*, JSC::Weak<JSDOMWrapper> > DOMObjectWrapperMap;
     36 typedef JSC::WeakGCMap<StringImpl*, JSC::JSString> JSStringCache;
     37 
     38 class JSDOMWrapperOwner : public JSC::WeakHandleOwner {
     39 public:
     40     JSDOMWrapperOwner(DOMWrapperWorld*);
     41     virtual void finalize(JSC::Handle<JSC::Unknown>, void* context);
     42 
     43 private:
     44     DOMWrapperWorld* m_world;
     45 };
     46 
     47 inline JSDOMWrapperOwner::JSDOMWrapperOwner(DOMWrapperWorld* world)
     48     : m_world(world)
     49 {
     50 }
     51 
     52 class DOMWrapperWorld : public RefCounted<DOMWrapperWorld> {
     53 public:
     54     static PassRefPtr<DOMWrapperWorld> create(JSC::JSGlobalData* globalData, bool isNormal = false)
     55     {
     56         return adoptRef(new DOMWrapperWorld(globalData, isNormal));
     57     }
     58     ~DOMWrapperWorld();
     59 
     60     // Free as much memory held onto by this world as possible.
     61     void clearWrappers();
     62 
     63     void didCreateWindowShell(ScriptController* scriptController) { m_scriptControllersWithWindowShells.add(scriptController); }
     64     void didDestroyWindowShell(ScriptController* scriptController) { m_scriptControllersWithWindowShells.remove(scriptController); }
     65 
     66     // FIXME: can we make this private?
     67     DOMObjectWrapperMap m_wrappers;
     68     JSStringCache m_stringCache;
     69 
     70     bool isNormal() const { return m_isNormal; }
     71 
     72     JSC::JSGlobalData* globalData() const { return m_globalData; }
     73     JSDOMWrapperOwner* defaultWrapperOwner() { return &m_defaultWrapperOwner; }
     74 
     75 protected:
     76     DOMWrapperWorld(JSC::JSGlobalData*, bool isNormal);
     77 
     78 private:
     79     JSC::JSGlobalData* m_globalData;
     80     HashSet<ScriptController*> m_scriptControllersWithWindowShells;
     81     bool m_isNormal;
     82     JSDOMWrapperOwner m_defaultWrapperOwner;
     83 };
     84 
     85 DOMWrapperWorld* normalWorld(JSC::JSGlobalData&);
     86 DOMWrapperWorld* mainThreadNormalWorld();
     87 inline DOMWrapperWorld* debuggerWorld() { return mainThreadNormalWorld(); }
     88 inline DOMWrapperWorld* pluginWorld() { return mainThreadNormalWorld(); }
     89 
     90 inline DOMWrapperWorld* currentWorld(JSC::ExecState* exec)
     91 {
     92     return static_cast<JSDOMGlobalObject*>(exec->lexicalGlobalObject())->world();
     93 }
     94 
     95 } // namespace WebCore
     96 
     97 #endif // DOMWrapperWorld_h
     98