Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: src/FilterEngine.cpp

Issue 10802049: Functional prefs implementation (Closed)
Patch Set: Cleaned up init.js a bit Created June 5, 2013, 9:44 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/FilterEngine.cpp
===================================================================
--- a/src/FilterEngine.cpp
+++ b/src/FilterEngine.cpp
@@ -16,16 +16,17 @@
*/
#include <algorithm>
#include <cctype>
#include <functional>
#include <string>
#include <AdblockPlus.h>
+#include "JsContext.h"
#include "Thread.h"
using namespace AdblockPlus;
extern std::string jsSources[];
Filter::Filter(JsValuePtr value)
: JsValue(value)
@@ -133,18 +134,24 @@ bool Subscription::operator==(const Subs
return GetProperty("url")->AsString() == subscription.GetProperty("url")->AsString();
}
FilterEngine::FilterEngine(JsEnginePtr jsEngine)
: jsEngine(jsEngine), initialized(false), firstRun(false)
{
jsEngine->SetEventCallback("init", std::tr1::bind(&FilterEngine::InitDone,
this, std::tr1::placeholders::_1));
- for (int i = 0; !jsSources[i].empty(); i += 2)
- jsEngine->Evaluate(jsSources[i + 1], jsSources[i]);
+
+ {
+ // Lock the JS engine while we are loading scripts, no timeouts should fire
+ // until we are done.
+ const JsContext context(jsEngine);
+ for (int i = 0; !jsSources[i].empty(); i += 2)
+ jsEngine->Evaluate(jsSources[i + 1], jsSources[i]);
+ }
// TODO: This should really be implemented via a conditional variable
while (!initialized)
::Sleep(10);
}
void FilterEngine::InitDone(JsValueList& params)
{
@@ -201,17 +208,17 @@ std::vector<SubscriptionPtr> FilterEngin
std::vector<SubscriptionPtr> result;
for (JsValueList::iterator it = values.begin(); it != values.end(); it++)
result.push_back(SubscriptionPtr(new Subscription(*it)));
return result;
}
AdblockPlus::FilterPtr FilterEngine::Matches(const std::string& url,
const std::string& contentType,
- const std::string& documentUrl)
+ const std::string& documentUrl) const
{
JsValuePtr func = jsEngine->Evaluate("API.checkFilterMatch");
JsValueList params;
params.push_back(jsEngine->NewValue(url));
params.push_back(jsEngine->NewValue(contentType));
params.push_back(jsEngine->NewValue(documentUrl));
JsValuePtr result = func->Call(params);
if (!result->IsNull())
@@ -226,8 +233,25 @@ std::vector<std::string> FilterEngine::G
JsValueList params;
params.push_back(jsEngine->NewValue(domain));
JsValueList result = func->Call(params)->AsList();
std::vector<std::string> selectors;
for (JsValueList::iterator it = result.begin(); it != result.end(); ++it)
selectors.push_back((*it)->AsString());
return selectors;
}
+
+JsValuePtr FilterEngine::GetPref(const std::string& pref) const
+{
+ JsValuePtr func = jsEngine->Evaluate("API.getPref");
+ JsValueList params;
+ params.push_back(jsEngine->NewValue(pref));
+ return func->Call(params);
+}
+
+void FilterEngine::SetPref(const std::string& pref, JsValuePtr value)
+{
+ JsValuePtr func = jsEngine->Evaluate("API.setPref");
+ JsValueList params;
+ params.push_back(jsEngine->NewValue(pref));
+ params.push_back(value);
+ func->Call(params);
+}

Powered by Google App Engine
This is Rietveld