| Index: compiled/api.cpp | 
| =================================================================== | 
| new file mode 100644 | 
| --- /dev/null | 
| +++ b/compiled/api.cpp | 
| @@ -0,0 +1,282 @@ | 
| +#include <exception> | 
| + | 
| +#include <emscripten.h> | 
| +#include <emscripten/trace.h> | 
| + | 
| +#include "Filter.h" | 
| +#include "InvalidFilter.h" | 
| +#include "ActiveFilter.h" | 
| +#include "RegExpFilter.h" | 
| +#include "ElemHideBase.h" | 
| +#include "CSSPropertyFilter.h" | 
| +#include "String.h" | 
| + | 
| +#define DO_PRAGMA(pragma) _Pragma(#pragma) | 
| +#define INSERT_MESSAGE(m) DO_PRAGMA(comment(m)) | 
| + | 
| +#define CLASS(name) \ | 
| +    extern "C"\ | 
| +    INSERT_MESSAGE(class name) | 
| + | 
| +#define AUGMENTS(name) INSERT_MESSAGE(augments name) | 
| +#define CLASS_INIT(func) INSERT_MESSAGE(class_init func) | 
| + | 
| +#define METHOD(name, impl) INSERT_MESSAGE(method name impl) | 
| +#define CLASS_METHOD(name, impl) INSERT_MESSAGE(class_method name impl) | 
| +#define STRING_ARG(pos) INSERT_MESSAGE(string_arg pos) | 
| +#define RETURNS_STRING INSERT_MESSAGE(string_result) | 
| +#define RETURNS_POINTER(cls) INSERT_MESSAGE(pointer_result cls) | 
| + | 
| +#define READONLY_PROPERTY(name, getter) INSERT_MESSAGE(property name getter) | 
| +#define PROPERTY(name, getter, setter) INSERT_MESSAGE(property name getter setter) | 
| +#define READONLY_STRING_PROPERTY(name, getter) INSERT_MESSAGE(string_property name getter) | 
| +#define STRING_PROPERTY(name, getter, setter) INSERT_MESSAGE(string_property name getter setter) | 
| +#define STATIC_PROPERTY(name, value) INSERT_MESSAGE(static_property name value) | 
| + | 
| +#define DIFFERENTIATOR(cls, func) INSERT_MESSAGE(differentiator cls func) | 
| +#define ASSOCIATE(value, cls) INSERT_MESSAGE(differentiator_mapping value cls) | 
| + | 
| +#if defined(__EMSCRIPTEN_TRACING__) | 
| +struct InitTracing | 
| +{ | 
| +  InitTracing() | 
| +  { | 
| +    emscripten_trace_configure("http://127.0.0.1:5000/", "MyApplication"); | 
| +  } | 
| + | 
| +  ~InitTracing() | 
| +  { | 
| +    emscripten_trace_close(); | 
| +  } | 
| +}; | 
| + | 
| +InitTracing foo; | 
| +#endif | 
| + | 
| +#define EXPOSE_FILTER_PROPERTY(class, type, name, getter, setter) \ | 
| +  type EMSCRIPTEN_KEEPALIVE class##_##getter(const class* filter)\ | 
| +  {\ | 
| +    return filter->getter();\ | 
| +  }\ | 
| +  void EMSCRIPTEN_KEEPALIVE class##_##setter(\ | 
| +      class* filter, type value)\ | 
| +  {\ | 
| +    filter->setter(value);\ | 
| +  }\ | 
| +  PROPERTY(name, class##_##getter, class##_##setter) | 
| + | 
| +#pragma clang diagnostic push | 
| +#pragma clang diagnostic ignored "-Wreturn-type-c-linkage" | 
| + | 
| +extern "C" | 
| +{ | 
| +  size_t EMSCRIPTEN_KEEPALIVE GetSizeofString() | 
| +  { | 
| +    return sizeof(String); | 
| +  } | 
| + | 
| +  void EMSCRIPTEN_KEEPALIVE InitString(String* str, String::value_type* data, | 
| +      String::size_type len) | 
| +  { | 
| +    // String is already allocated on stack, we merely need to call constructor. | 
| +    new (str) String(data, len); | 
| +  } | 
| + | 
| +  void EMSCRIPTEN_KEEPALIVE DestroyString(String* str) | 
| +  { | 
| +    // Stack memory will be freed automatically, we need to call destructor | 
| +    // explicitly however. | 
| +    str->~String(); | 
| +  } | 
| + | 
| +  String::size_type EMSCRIPTEN_KEEPALIVE GetStringLength(const String& str) | 
| +  { | 
| +    return str.length(); | 
| +  } | 
| + | 
| +  const String::value_type* EMSCRIPTEN_KEEPALIVE GetStringData(const String& str) | 
| +  { | 
| +    return str.data(); | 
| +  } | 
| + | 
| +  void EMSCRIPTEN_KEEPALIVE DeletePointer(Filter* ptr) | 
| +  { | 
| +    ptr->ReleaseRef(); | 
| +  } | 
| +} | 
| + | 
| +DIFFERENTIATOR(Filter, Filter_GetType) | 
| +  ASSOCIATE(1, InvalidFilter) | 
| +  ASSOCIATE(2, CommentFilter) | 
| +  ASSOCIATE(3, RegExpFilter) | 
| +  ASSOCIATE(4, WhitelistFilter) | 
| +  ASSOCIATE(5, ElemHideFilter) | 
| +  ASSOCIATE(6, ElemHideException) | 
| +  ASSOCIATE(7, CSSPropertyFilter) | 
| + | 
| +CLASS(Filter) | 
| +{ | 
| +  String EMSCRIPTEN_KEEPALIVE Filter_GetText(const Filter* filter) | 
| +  { | 
| +    return filter->GetText(); | 
| +  } | 
| +  READONLY_STRING_PROPERTY(text, Filter_GetText) | 
| + | 
| +  Filter::Type EMSCRIPTEN_KEEPALIVE Filter_GetType(const Filter* filter) | 
| +  { | 
| +    return filter->GetType(); | 
| +  } | 
| + | 
| +  String EMSCRIPTEN_KEEPALIVE Filter_Serialize(const Filter* filter) | 
| +  { | 
| +    return filter->Serialize(); | 
| +  } | 
| +  METHOD(serialize, Filter_Serialize) RETURNS_STRING | 
| + | 
| +  Filter* EMSCRIPTEN_KEEPALIVE Filter_FromText(String& text) | 
| +  { | 
| +    Filter* filter = Filter::FromText(text); | 
| +    filter->AddRef(); | 
| +    return filter; | 
| +  } | 
| +  CLASS_METHOD(fromText, Filter_FromText) STRING_ARG(0) RETURNS_POINTER(Filter) | 
| + | 
| +  String EMSCRIPTEN_KEEPALIVE Filter_Normalize(String& text) | 
| +  { | 
| +    return Filter::Normalize(text); | 
| +  } | 
| +  CLASS_METHOD(normalize, Filter_Normalize) STRING_ARG(0) RETURNS_STRING | 
| +} | 
| + | 
| +CLASS(InvalidFilter) | 
| +{ | 
| +  AUGMENTS(Filter) | 
| +  STATIC_PROPERTY(type, "invalid") | 
| + | 
| +  String EMSCRIPTEN_KEEPALIVE InvalidFilter_GetReason(const InvalidFilter* filter) | 
| +  { | 
| +    return filter->GetReason(); | 
| +  } | 
| +  READONLY_STRING_PROPERTY(reason, InvalidFilter_GetReason) | 
| +} | 
| + | 
| +CLASS(CommentFilter) | 
| +{ | 
| +  AUGMENTS(Filter) | 
| +  STATIC_PROPERTY(type, "comment") | 
| +} | 
| + | 
| +CLASS(ActiveFilter) | 
| +{ | 
| +  AUGMENTS(Filter) | 
| + | 
| +  EXPOSE_FILTER_PROPERTY(ActiveFilter, bool, disabled, GetDisabled, SetDisabled); | 
| +  EXPOSE_FILTER_PROPERTY(ActiveFilter, unsigned int, hitCount, GetHitCount, SetHitCount); | 
| +  EXPOSE_FILTER_PROPERTY(ActiveFilter, unsigned int, lastHit, GetLastHit, SetLastHit); | 
| + | 
| +  bool EMSCRIPTEN_KEEPALIVE ActiveFilter_IsActiveOnDomain( | 
| +    const ActiveFilter* filter, String& domain, String& sitekey) | 
| +  { | 
| +    return filter->IsActiveOnDomain(domain, sitekey); | 
| +  } | 
| +  METHOD(isActiveOnDomain, ActiveFilter_IsActiveOnDomain) STRING_ARG(0) STRING_ARG(1) | 
| + | 
| +  bool EMSCRIPTEN_KEEPALIVE ActiveFilter_IsActiveOnlyOnDomain( | 
| +    const ActiveFilter* filter, String& domain) | 
| +  { | 
| +    return filter->IsActiveOnlyOnDomain(domain); | 
| +  } | 
| +  METHOD(isActiveOnlyOnDomain, ActiveFilter_IsActiveOnlyOnDomain) STRING_ARG(0) | 
| + | 
| +  bool EMSCRIPTEN_KEEPALIVE ActiveFilter_IsGeneric(const ActiveFilter* filter) | 
| +  { | 
| +    return filter->IsGeneric(); | 
| +  } | 
| +  METHOD(isGeneric, ActiveFilter_IsGeneric) | 
| +} | 
| + | 
| +CLASS(RegExpFilter) | 
| +{ | 
| +  AUGMENTS(ActiveFilter) | 
| +  STATIC_PROPERTY(type, "blocking") | 
| + | 
| +  bool EMSCRIPTEN_KEEPALIVE RegExpFilter_Matches(const RegExpFilter* filter, | 
| +      String& location, int typeMask, String& docDomain, bool thirdParty, | 
| +      String& sitekey) | 
| +  { | 
| +    return filter->Matches(location, typeMask, docDomain, thirdParty, sitekey); | 
| +  } | 
| +  METHOD(matches, RegExpFilter_Matches) STRING_ARG(0) STRING_ARG(2) STRING_ARG(4) | 
| + | 
| +  void EMSCRIPTEN_KEEPALIVE RegExpFilter_InitJSTypes() | 
| +  { | 
| +    RegExpFilter::InitJSTypes(); | 
| +  } | 
| +  CLASS_INIT(RegExpFilter_InitJSTypes) | 
| +} | 
| + | 
| +CLASS(WhitelistFilter) | 
| +{ | 
| +  AUGMENTS(RegExpFilter) | 
| +  STATIC_PROPERTY(type, "whitelist") | 
| +} | 
| + | 
| +CLASS(ElemHideBase) | 
| +{ | 
| +  AUGMENTS(ActiveFilter) | 
| + | 
| +  String EMSCRIPTEN_KEEPALIVE ElemHideBase_GetSelector( | 
| +      const ElemHideBase* filter) | 
| +  { | 
| +    return filter->GetSelector(); | 
| +  } | 
| +  READONLY_STRING_PROPERTY(selector, ElemHideBase_GetSelector) | 
| + | 
| +  String EMSCRIPTEN_KEEPALIVE ElemHideBase_GetSelectorDomain( | 
| +      const ElemHideBase* filter) | 
| +  { | 
| +    return filter->GetSelectorDomain(); | 
| +  } | 
| +  READONLY_STRING_PROPERTY(selectorDomain, ElemHideBase_GetSelectorDomain) | 
| +} | 
| + | 
| +CLASS(ElemHideFilter) | 
| +{ | 
| +  AUGMENTS(ElemHideBase) | 
| +  STATIC_PROPERTY(type, "elemhide") | 
| +} | 
| + | 
| +CLASS(ElemHideException) | 
| +{ | 
| +  AUGMENTS(ElemHideBase) | 
| +  STATIC_PROPERTY(type, "elemhideexception") | 
| +} | 
| + | 
| +CLASS(CSSPropertyFilter) | 
| +{ | 
| +  AUGMENTS(ElemHideBase) | 
| +  STATIC_PROPERTY(type, "cssproperty") | 
| + | 
| +  String EMSCRIPTEN_KEEPALIVE CSSPropertyFilter_GetRegExpString( | 
| +      const CSSPropertyFilter* filter) | 
| +  { | 
| +    return filter->GetRegExpString(); | 
| +  } | 
| +  READONLY_STRING_PROPERTY(regexpString, CSSPropertyFilter_GetRegExpString) | 
| + | 
| +  String EMSCRIPTEN_KEEPALIVE CSSPropertyFilter_GetSelectorPrefix( | 
| +      const CSSPropertyFilter* filter) | 
| +  { | 
| +    return filter->GetSelectorPrefix(); | 
| +  } | 
| +  READONLY_STRING_PROPERTY(selectorPrefix, CSSPropertyFilter_GetSelectorPrefix) | 
| + | 
| +  String EMSCRIPTEN_KEEPALIVE CSSPropertyFilter_GetSelectorSuffix( | 
| +      const CSSPropertyFilter* filter) | 
| +  { | 
| +    return filter->GetSelectorSuffix(); | 
| +  } | 
| +  READONLY_STRING_PROPERTY(selectorSuffix, CSSPropertyFilter_GetSelectorSuffix) | 
| +} | 
| + | 
| +#pragma clang diagnostic pop | 
|  |