| Index: src/FilterEngine.cpp | 
| =================================================================== | 
| --- a/src/FilterEngine.cpp | 
| +++ b/src/FilterEngine.cpp | 
| @@ -168,19 +168,19 @@ | 
| auto sync = std::make_shared<Sync>(); | 
| auto isConnectionAllowedCallback = params.isConnectionAllowedCallback; | 
| if (isConnectionAllowedCallback) | 
| jsEngine->SetIsConnectionAllowedCallback([sync, jsEngine]()->bool | 
| { | 
| sync->Wait(); | 
| return jsEngine->IsConnectionAllowed(); | 
| }); | 
| -  jsEngine->SetEventCallback("_init", [jsEngine, filterEngine, onCreated, sync, isConnectionAllowedCallback](const JsConstValueList& params) | 
| +  jsEngine->SetEventCallback("_init", [jsEngine, filterEngine, onCreated, sync, isConnectionAllowedCallback](const JsValueList& params) | 
| { | 
| -    filterEngine->firstRun = params.size() && params[0]->AsBool(); | 
| +    filterEngine->firstRun = params.size() && params[0].AsBool(); | 
| if (isConnectionAllowedCallback) | 
| { | 
| std::weak_ptr<FilterEngine> weakFilterEngine = filterEngine; | 
| jsEngine->SetIsConnectionAllowedCallback([weakFilterEngine, isConnectionAllowedCallback]()->bool | 
| { | 
| auto filterEngine = weakFilterEngine.lock(); | 
| if (!filterEngine) | 
| return false; | 
| @@ -192,23 +192,23 @@ | 
| jsEngine->RemoveEventCallback("_init"); | 
| }); | 
|  | 
| // Lock the JS engine while we are loading scripts, no timeouts should fire | 
| // until we are done. | 
| const JsContext context(jsEngine); | 
|  | 
| // Set the preconfigured prefs | 
| -  JsValuePtr preconfiguredPrefsObject = jsEngine->NewObject(); | 
| +  auto preconfiguredPrefsObject = jsEngine->NewObject(); | 
| for (FilterEngine::Prefs::const_iterator it = params.preconfiguredPrefs.begin(); | 
| it != params.preconfiguredPrefs.end(); it++) | 
| { | 
| -    preconfiguredPrefsObject->SetProperty(it->first, *it->second); | 
| +    preconfiguredPrefsObject.SetProperty(it->first, it->second); | 
| } | 
| -  jsEngine->SetGlobalProperty("_preconfiguredPrefs", *preconfiguredPrefsObject); | 
| +  jsEngine->SetGlobalProperty("_preconfiguredPrefs", preconfiguredPrefsObject); | 
| // Load adblockplus scripts | 
| for (int i = 0; !jsSources[i].empty(); i += 2) | 
| jsEngine->Evaluate(jsSources[i + 1], jsSources[i]); | 
| } | 
|  | 
| FilterEnginePtr FilterEngine::Create(const JsEnginePtr& jsEngine, | 
| const FilterEngine::CreationParameters& params) | 
| { | 
| @@ -274,74 +274,74 @@ | 
| bool FilterEngine::IsFirstRun() const | 
| { | 
| return firstRun; | 
| } | 
|  | 
| FilterPtr FilterEngine::GetFilter(const std::string& text) const | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.getFilterFromText"); | 
| -  return FilterPtr(new Filter(func->Call(*jsEngine->NewValue(text)))); | 
| +  return FilterPtr(new Filter(func->Call(jsEngine->NewValue(text)))); | 
| } | 
|  | 
| SubscriptionPtr FilterEngine::GetSubscription(const std::string& url) const | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.getSubscriptionFromUrl"); | 
| -  return SubscriptionPtr(new Subscription(func->Call(*jsEngine->NewValue(url)))); | 
| +  return SubscriptionPtr(new Subscription(func->Call(jsEngine->NewValue(url)))); | 
| } | 
|  | 
| std::vector<FilterPtr> FilterEngine::GetListedFilters() const | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.getListedFilters"); | 
| JsValueList values = func->Call().AsList(); | 
| std::vector<FilterPtr> result; | 
| for (JsValueList::iterator it = values.begin(); it != values.end(); it++) | 
| -    result.push_back(FilterPtr(new Filter(std::move(**it)))); | 
| +    result.push_back(FilterPtr(new Filter(std::move(*it)))); | 
| return result; | 
| } | 
|  | 
| std::vector<SubscriptionPtr> FilterEngine::GetListedSubscriptions() const | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.getListedSubscriptions"); | 
| JsValueList values = func->Call().AsList(); | 
| std::vector<SubscriptionPtr> result; | 
| for (JsValueList::iterator it = values.begin(); it != values.end(); it++) | 
| -    result.push_back(SubscriptionPtr(new Subscription(std::move(**it)))); | 
| +    result.push_back(SubscriptionPtr(new Subscription(std::move(*it)))); | 
| return result; | 
| } | 
|  | 
| std::vector<SubscriptionPtr> FilterEngine::FetchAvailableSubscriptions() const | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.getRecommendedSubscriptions"); | 
| JsValueList values = func->Call().AsList(); | 
| std::vector<SubscriptionPtr> result; | 
| for (JsValueList::iterator it = values.begin(); it != values.end(); it++) | 
| -    result.push_back(SubscriptionPtr(new Subscription(std::move(**it)))); | 
| +    result.push_back(SubscriptionPtr(new Subscription(std::move(*it)))); | 
| return result; | 
| } | 
|  | 
| void FilterEngine::SetAAEnabled(bool enabled) | 
| { | 
| -  jsEngine->Evaluate("API.setAASubscriptionEnabled")->Call(*jsEngine->NewValue(enabled)); | 
| +  jsEngine->Evaluate("API.setAASubscriptionEnabled")->Call(jsEngine->NewValue(enabled)); | 
| } | 
|  | 
| bool FilterEngine::IsAAEnabled() const | 
| { | 
| return jsEngine->Evaluate("API.isAASubscriptionEnabled()")->AsBool(); | 
| } | 
|  | 
| std::string FilterEngine::GetAAUrl() const | 
| { | 
| -  return GetPref("subscriptions_exceptionsurl")->AsString(); | 
| +  return GetPref("subscriptions_exceptionsurl").AsString(); | 
| } | 
|  | 
| void FilterEngine::ShowNextNotification(const std::string& url) const | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.showNextNotification"); | 
| -  JsConstValueList params; | 
| +  JsValueList params; | 
| if (!url.empty()) | 
| { | 
| params.push_back(jsEngine->NewValue(url)); | 
| } | 
| func->Call(params); | 
| } | 
|  | 
| void FilterEngine::SetShowNotificationCallback(const ShowNotificationCallback& value) | 
| @@ -400,100 +400,99 @@ | 
| return !!GetWhitelistingFilter(url, CONTENT_TYPE_ELEMHIDE, documentUrls); | 
| } | 
|  | 
| AdblockPlus::FilterPtr FilterEngine::CheckFilterMatch(const std::string& url, | 
| ContentTypeMask contentTypeMask, | 
| const std::string& documentUrl) const | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.checkFilterMatch"); | 
| -  JsConstValueList params; | 
| +  JsValueList params; | 
| params.push_back(jsEngine->NewValue(url)); | 
| params.push_back(jsEngine->NewValue(contentTypeMask)); | 
| params.push_back(jsEngine->NewValue(documentUrl)); | 
| JsValue result = func->Call(params); | 
| if (!result.IsNull()) | 
| return FilterPtr(new Filter(std::move(result))); | 
| else | 
| return FilterPtr(); | 
| } | 
|  | 
| std::vector<std::string> FilterEngine::GetElementHidingSelectors(const std::string& domain) const | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.getElementHidingSelectors"); | 
| -  JsValueList result = func->Call(*jsEngine->NewValue(domain)).AsList(); | 
| +  JsValueList result = func->Call(jsEngine->NewValue(domain)).AsList(); | 
| std::vector<std::string> selectors; | 
| for (const auto& r: result) | 
| -    selectors.push_back(r->AsString()); | 
| +    selectors.push_back(r.AsString()); | 
| return selectors; | 
| } | 
|  | 
| -JsValuePtr FilterEngine::GetPref(const std::string& pref) const | 
| +JsValue FilterEngine::GetPref(const std::string& pref) const | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.getPref"); | 
| -  return std::make_shared<JsValue>(func->Call(*jsEngine->NewValue(pref))); | 
| +  return func->Call(jsEngine->NewValue(pref)); | 
| } | 
|  | 
| -void FilterEngine::SetPref(const std::string& pref, const JsValuePtr& value) | 
| +void FilterEngine::SetPref(const std::string& pref, const JsValue& value) | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.setPref"); | 
| -  JsConstValueList params; | 
| +  JsValueList params; | 
| params.push_back(jsEngine->NewValue(pref)); | 
| -  if (value) | 
| -    params.push_back(value); | 
| +  params.push_back(value); | 
| func->Call(params); | 
| } | 
|  | 
| std::string FilterEngine::GetHostFromURL(const std::string& url) const | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.getHostFromUrl"); | 
| -  return func->Call(*jsEngine->NewValue(url)).AsString(); | 
| +  return func->Call(jsEngine->NewValue(url)).AsString(); | 
| } | 
|  | 
| void FilterEngine::SetUpdateAvailableCallback( | 
| const FilterEngine::UpdateAvailableCallback& callback) | 
| { | 
| jsEngine->SetEventCallback("updateAvailable", | 
| std::bind(&FilterEngine::UpdateAvailable, this, callback, | 
| std::placeholders::_1)); | 
| } | 
|  | 
| void FilterEngine::RemoveUpdateAvailableCallback() | 
| { | 
| jsEngine->RemoveEventCallback("updateAvailable"); | 
| } | 
|  | 
| void FilterEngine::UpdateAvailable( | 
| -    const FilterEngine::UpdateAvailableCallback& callback, const JsConstValueList& params) const | 
| +    const FilterEngine::UpdateAvailableCallback& callback, const JsValueList& params) const | 
| { | 
| -  if (params.size() >= 1 && !params[0]->IsNull()) | 
| -    callback(params[0]->AsString()); | 
| +  if (params.size() >= 1 && !params[0].IsNull()) | 
| +    callback(params[0].AsString()); | 
| } | 
|  | 
| void FilterEngine::ForceUpdateCheck( | 
| const FilterEngine::UpdateCheckDoneCallback& callback) | 
| { | 
| JsValuePtr func = jsEngine->Evaluate("API.forceUpdateCheck"); | 
| -  JsConstValueList params; | 
| +  JsValueList params; | 
| if (callback) | 
| { | 
| std::string eventName = "_updateCheckDone" + std::to_string(++updateCheckId); | 
| jsEngine->SetEventCallback(eventName, std::bind(&FilterEngine::UpdateCheckDone, | 
| this, eventName, callback, std::placeholders::_1)); | 
| params.push_back(jsEngine->NewValue(eventName)); | 
| } | 
| func->Call(params); | 
| } | 
|  | 
| void FilterEngine::UpdateCheckDone(const std::string& eventName, | 
| -    const FilterEngine::UpdateCheckDoneCallback& callback, const JsConstValueList& params) | 
| +    const FilterEngine::UpdateCheckDoneCallback& callback, const JsValueList& params) | 
| { | 
| jsEngine->RemoveEventCallback(eventName); | 
|  | 
| -  std::string error(params.size() >= 1 && !params[0]->IsNull() ? params[0]->AsString() : ""); | 
| +  std::string error(params.size() >= 1 && !params[0].IsNull() ? params[0].AsString() : ""); | 
| callback(error); | 
| } | 
|  | 
| void FilterEngine::SetFilterChangeCallback(const FilterEngine::FilterChangeCallback& callback) | 
| { | 
| jsEngine->SetEventCallback("filterChange", std::bind(&FilterEngine::FilterChanged, | 
| this, callback, std::placeholders::_1)); | 
| } | 
| @@ -506,45 +505,45 @@ | 
| void FilterEngine::SetAllowedConnectionType(const std::string* value) | 
| { | 
| SetPref("allowed_connection_type", value ? jsEngine->NewValue(*value) : jsEngine->NewValue("")); | 
| } | 
|  | 
| std::unique_ptr<std::string> FilterEngine::GetAllowedConnectionType() const | 
| { | 
| auto prefValue = GetPref("allowed_connection_type"); | 
| -   if (prefValue->AsString().empty()) | 
| +   if (prefValue.AsString().empty()) | 
| return nullptr; | 
| -   return std::unique_ptr<std::string>(new std::string(prefValue->AsString())); | 
| +   return std::unique_ptr<std::string>(new std::string(prefValue.AsString())); | 
| } | 
|  | 
| -void FilterEngine::FilterChanged(const FilterEngine::FilterChangeCallback& callback, const JsConstValueList& params) const | 
| +void FilterEngine::FilterChanged(const FilterEngine::FilterChangeCallback& callback, const JsValueList& params) const | 
| { | 
| -  std::string action(params.size() >= 1 && !params[0]->IsNull() ? params[0]->AsString() : ""); | 
| -  JsConstValuePtr item(params.size() >= 2 ? params[1] : jsEngine->NewValue(false)); | 
| -  callback(action, *item); | 
| +  std::string action(params.size() >= 1 && !params[0].IsNull() ? params[0].AsString() : ""); | 
| +  JsValue item(params.size() >= 2 ? params[1] : jsEngine->NewValue(false)); | 
| +  callback(action, item); | 
| } | 
|  | 
| void FilterEngine::ShowNotification(const ShowNotificationCallback& callback, | 
| -                                         const JsConstValueList& params) const | 
| +                                         const JsValueList& params) const | 
| { | 
| if (params.size() < 1) | 
| return; | 
|  | 
| -  if (!params[0]->IsObject()) | 
| +  if (!params[0].IsObject()) | 
| { | 
| return; | 
| } | 
| -  callback(NotificationPtr(new Notification(params[0]->Clone()))); | 
| +  callback(NotificationPtr(new Notification(JsValue(params[0])))); | 
| } | 
|  | 
|  | 
| int FilterEngine::CompareVersions(const std::string& v1, const std::string& v2) const | 
| { | 
| -  JsConstValueList params; | 
| +  JsValueList params; | 
| params.push_back(jsEngine->NewValue(v1)); | 
| params.push_back(jsEngine->NewValue(v2)); | 
| JsValuePtr func = jsEngine->Evaluate("API.compareVersions"); | 
| return func->Call(params).AsInt(); | 
| } | 
|  | 
| FilterPtr FilterEngine::GetWhitelistingFilter(const std::string& url, | 
| ContentTypeMask contentTypeMask, const std::string& documentUrl) const | 
|  |