blob: 14f757c1f0020b45d7ac5a7ceb0b1b48821ccc48 [file]
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef DartDOMData_h
#define DartDOMData_h
#include "bindings/core/dart/DartCustomElementBinding.h"
#include "bindings/core/dart/DartJsInteropData.h"
#include "bindings/core/dart/DartLibraryIds.h"
#include "bindings/core/dart/DartScriptState.h"
#include "bindings/core/dart/DartStringCache.h"
#include "bindings/dart/DartWebkitClassIds.h"
#include "wtf/HashMap.h"
#include "wtf/HashSet.h"
#include "wtf/RefPtr.h"
#include "wtf/Threading.h"
#include "wtf/ThreadingPrimitives.h"
#include "wtf/Vector.h"
#include "wtf/text/WTFString.h"
#include <dart_api.h>
namespace blink {
class ActiveDOMObject;
class CustomElementDefinition;
class DartApplicationLoader;
class DartEventListener;
class DartIsolateDestructionObserver;
class EventTarget;
class ExecutionContext;
class LocalDOMWindow;
class MessagePort;
class Node;
class ThreadSafeDartIsolateWrapper;
typedef HashMap<void*, Dart_WeakPersistentHandle> DartDOMObjectMap;
typedef HashMap<MessagePort*, Dart_WeakPersistentHandle> DartMessagePortMap;
typedef HashSet<DartIsolateDestructionObserver*> DartIsolateDestructionObservers;
typedef HashMap<CustomElementDefinition*, OwnPtr<DartCustomElementBinding> > DartCustomElementBindingMap;
typedef Dart_PersistentHandle ClassTable[NumWebkitClassIds];
typedef Dart_PersistentHandle LibraryTable[NumDartLibraryIds];
typedef HashMap<Node*, Dart_WeakReferenceSet> WeakReferenceSetForRootMap;
class DartDOMData {
public:
DartDOMData(ExecutionContext*, const char* scriptURL, bool isDOMEnabled);
~DartDOMData();
static DartDOMData* current();
char* scriptURL() const { return m_scriptURL; }
ExecutionContext* scriptExecutionContext() { return m_scriptExecutionContext; }
bool isDOMEnabled() { return m_isDOMEnabled; }
// We track the Dart specific recursion level here as well as the global
// recursion level tracked by m_recursionScope due to dartbug.com/14183.
int* recursion() { return &m_recursion; }
DartStringCache& stringCache() { return m_stringCache; }
void setThreadSafeIsolateWrapper(PassRefPtr<ThreadSafeDartIsolateWrapper>);
PassRefPtr<ThreadSafeDartIsolateWrapper> threadSafeIsolateWrapper();
void setApplicationLoader(PassRefPtr<DartApplicationLoader>);
PassRefPtr<DartApplicationLoader> applicationLoader();
Vector<uint8_t>* applicationSnapshot() { return &m_applicationSnapshot; }
void setReachableWeakHandle(Dart_WeakPersistentHandle reachableWeakHandle)
{
m_reachableWeakHandle = reachableWeakHandle;
}
Dart_WeakPersistentHandle reachableWeakHandle() { return m_reachableWeakHandle; }
DartDOMObjectMap* objectMap() { return &m_objectMap; }
DartMessagePortMap* messagePortMap() { return &m_messagePortMap; }
DartIsolateDestructionObservers* isolateDestructionObservers()
{
return &m_isolateDestructionObservers;
}
ClassTable* classHandleCache() { return &m_classHandleCache; }
void addCustomElementBinding(CustomElementDefinition*, PassOwnPtr<DartCustomElementBinding>);
void clearCustomElementBinding(CustomElementDefinition*);
DartCustomElementBinding* customElementBinding(CustomElementDefinition*);
Dart_PersistentHandle library(int libraryId) const { return m_libraryHandleCache[libraryId]; }
Dart_PersistentHandle blinkLibrary() const
{
return m_libraryHandleCache[DartBlinkLibraryId];
}
void setBlinkLibrary(Dart_PersistentHandle lib)
{
m_libraryHandleCache[DartBlinkLibraryId] = lib;
}
Dart_PersistentHandle htmlLibrary() const
{
return m_libraryHandleCache[DartHtmlLibraryId];
}
void setHtmlLibrary(Dart_PersistentHandle lib)
{
m_libraryHandleCache[DartHtmlLibraryId] = lib;
}
Dart_PersistentHandle svgLibrary()
{
Dart_PersistentHandle lib = m_libraryHandleCache[DartSvgLibraryId];
if (!lib) {
lib = getLibrary(DartSvgLibraryId, "dart:svg");
m_libraryHandleCache[DartSvgLibraryId] = lib;
}
return lib;
}
void setSvgLibrary(Dart_PersistentHandle lib)
{
m_libraryHandleCache[DartSvgLibraryId] = lib;
}
Dart_PersistentHandle jsLibrary() const
{
return m_libraryHandleCache[DartJsLibraryId];
}
void setJsLibrary(Dart_PersistentHandle lib)
{
m_libraryHandleCache[DartJsLibraryId] = lib;
}
Dart_Handle emptyString() const
{
return Dart_EmptyString();
}
Dart_PersistentHandle functionType() const
{
return m_functionType;
}
void setFunctionType(Dart_PersistentHandle functionType)
{
m_functionType = functionType;
}
DartJsInteropData* jsInteropData()
{
return &m_jsInteropData;
}
DartScriptState* rootScriptState()
{
return m_rootScriptState;
}
void setRootScriptState(DartScriptState* scriptState)
{
m_rootScriptState = scriptState;
}
Dart_PersistentHandle currentException() const
{
return m_currentException;
}
void setCurrentException(Dart_PersistentHandle exception)
{
m_currentException = exception;
}
WeakReferenceSetForRootMap* weakReferenceSetForRootMap() const
{
return m_weakReferenceSetForRootMap;
}
void setWeakReferenceSetForRootMap(WeakReferenceSetForRootMap* map)
{
m_weakReferenceSetForRootMap = map;
}
Dart_WeakReferenceSet documentWeakReferenceSet() const
{
return m_documentWeakReferenceSet;
}
void setDocumentWeakReferenceSet(Dart_WeakReferenceSet set)
{
m_documentWeakReferenceSet = set;
}
Dart_WeakReferenceSetBuilder weakReferenceSetBuilder() const
{
return m_weakReferenceSetBuilder;
}
void setWeakReferenceSetBuilder(Dart_WeakReferenceSetBuilder setBuilder)
{
m_weakReferenceSetBuilder = setBuilder;
}
bool isObservatoryFakeDartDOMData() const
{
return m_isObservatoryFakeDartDOMData;
}
void setIsObservatoryFakeDartDOMData(bool isObservatoryFakeDartDOMData)
{
m_isObservatoryFakeDartDOMData = isObservatoryFakeDartDOMData;
}
private:
Dart_PersistentHandle getLibrary(int libraryId, const char* name);
char* m_scriptURL;
ExecutionContext* m_scriptExecutionContext;
bool m_isDOMEnabled;
int m_recursion;
DartStringCache m_stringCache;
RefPtr<ThreadSafeDartIsolateWrapper> m_threadSafeIsolateWrapper;
Mutex m_isolateWrapperMutex;
RefPtr<DartApplicationLoader> m_applicationLoader;
Vector<uint8_t> m_applicationSnapshot;
Dart_WeakPersistentHandle m_reachableWeakHandle;
DartJsInteropData m_jsInteropData;
DartDOMObjectMap m_objectMap;
DartMessagePortMap m_messagePortMap;
DartIsolateDestructionObservers m_isolateDestructionObservers;
DartCustomElementBindingMap m_customElementBindings;
ClassTable m_classHandleCache;
LibraryTable m_libraryHandleCache;
Dart_PersistentHandle m_functionType;
Dart_PersistentHandle m_currentException;
DartScriptState* m_rootScriptState;
WeakReferenceSetForRootMap* m_weakReferenceSetForRootMap;
Dart_WeakReferenceSet m_documentWeakReferenceSet;
Dart_WeakReferenceSetBuilder m_weakReferenceSetBuilder;
// FIXME(dartbug.com/20303): remove this field once we support service
// isolates.
bool m_isObservatoryFakeDartDOMData;
};
}
#endif // DartDOMData_h