| Index: compiled/bindings.cpp | 
| =================================================================== | 
| new file mode 100644 | 
| --- /dev/null | 
| +++ b/compiled/bindings.cpp | 
| @@ -0,0 +1,112 @@ | 
| +#include <emscripten.h> | 
| + | 
| +#include "bindings.h" | 
| +#include "String.h" | 
| +#include "intrusive_ptr.h" | 
| +#include "Filter.h" | 
| +#include "InvalidFilter.h" | 
| +#include "CommentFilter.h" | 
| +#include "ActiveFilter.h" | 
| +#include "RegExpFilter.h" | 
| +#include "WhitelistFilter.h" | 
| +#include "ElemHideBase.h" | 
| +#include "ElemHideFilter.h" | 
| +#include "ElemHideException.h" | 
| +#include "CSSPropertyFilter.h" | 
| + | 
| +extern "C" | 
| +{ | 
| +  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 AddRef(ref_counted* ptr) | 
| +  { | 
| +    ptr->AddRef(); | 
| +  } | 
| + | 
| +  void EMSCRIPTEN_KEEPALIVE ReleaseRef(ref_counted* ptr) | 
| +  { | 
| +    ptr->ReleaseRef(); | 
| +  } | 
| +} | 
| + | 
| +#if defined(PRINT_BINDINGS) | 
| +EMSCRIPTEN_BINDINGS(api) | 
| +{ | 
| +  class_<Filter>("Filter") | 
| +      .property("text", &Filter::GetText) | 
| +      .function("serialize", &Filter::Serialize) | 
| +      .class_function("fromText", &Filter::FromText) | 
| +      .class_function("normalize", &Filter::Normalize) | 
| +      .subclass_differentiator(&Filter::GetType, { | 
| +        {Filter::Type::INVALID, "InvalidFilter"}, | 
| +        {Filter::Type::COMMENT, "CommentFilter"}, | 
| +        {Filter::Type::BLOCKING, "RegExpFilter"}, | 
| +        {Filter::Type::WHITELIST, "WhitelistFilter"}, | 
| +        {Filter::Type::ELEMHIDE, "ElemHideFilter"}, | 
| +        {Filter::Type::ELEMHIDEEXCEPTION, "ElemHideException"}, | 
| +        {Filter::Type::CSSPROPERTY, "CSSPropertyFilter"}, | 
| +      }); | 
| + | 
| +  class_<InvalidFilter,Filter>("InvalidFilter") | 
| +      .class_property("type", "'invalid'") | 
| +      .property("reason", &InvalidFilter::GetReason); | 
| + | 
| +  class_<CommentFilter,Filter>("CommentFilter") | 
| +      .class_property("type", "'comment'"); | 
| + | 
| +  class_<ActiveFilter,Filter>("ActiveFilter") | 
| +      .property("disabled", &ActiveFilter::GetDisabled, &ActiveFilter::SetDisabled) | 
| +      .property("hitCount", &ActiveFilter::GetHitCount, &ActiveFilter::SetHitCount) | 
| +      .property("lastHit", &ActiveFilter::GetLastHit, &ActiveFilter::SetLastHit) | 
| +      .function("isActiveOnDomain", &ActiveFilter::IsActiveOnDomain) | 
| +      .function("isActiveOnlyOnDomain", &ActiveFilter::IsActiveOnlyOnDomain) | 
| +      .function("isGeneric", &ActiveFilter::IsGeneric) | 
| +      .function("serialize", &ActiveFilter::Serialize); | 
| + | 
| +  class_<RegExpFilter,ActiveFilter>("RegExpFilter") | 
| +      .class_property("type", "'blocking'") | 
| +      .function("matches", &RegExpFilter::Matches) | 
| +      .class_initializer(&RegExpFilter::InitJSTypes); | 
| + | 
| +  class_<WhitelistFilter,RegExpFilter>("WhitelistFilter") | 
| +      .class_property("type", "'whitelist'"); | 
| + | 
| +  class_<ElemHideBase,ActiveFilter>("ElemHideBase") | 
| +      .property("selector", &ElemHideBase::GetSelector) | 
| +      .property("selectorDomain", &ElemHideBase::GetSelectorDomain); | 
| + | 
| +  class_<ElemHideFilter,ElemHideBase>("ElemHideFilter") | 
| +      .class_property("type", "'elemhide'"); | 
| + | 
| +  class_<ElemHideException,ElemHideBase>("ElemHideException") | 
| +      .class_property("type", "'elemhideexception'"); | 
| + | 
| +  class_<CSSPropertyFilter,ElemHideBase>("CSSPropertyFilter") | 
| +      .class_property("type", "'cssproperty'") | 
| +      .property("regexpString", &CSSPropertyFilter::GetRegExpString) | 
| +      .property("selectorPrefix", &CSSPropertyFilter::GetSelectorPrefix) | 
| +      .property("selectorSuffix", &CSSPropertyFilter::GetSelectorSuffix); | 
| +} | 
| +#endif | 
|  |