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

Unified Diff: src/WebRequestJsObject.cpp

Issue 29361562: Issue 3594 - remove circular references JsEngine-JsValue-JsEngine (Closed)
Patch Set: Created Nov. 3, 2016, 11:26 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/WebRequestJsObject.cpp
diff --git a/src/WebRequestJsObject.cpp b/src/WebRequestJsObject.cpp
index 48a703709053895845a5bb83e4036158b9b094f9..5eefd27ee99b3eebed1841eae88724a756b01299 100644
--- a/src/WebRequestJsObject.cpp
+++ b/src/WebRequestJsObject.cpp
@@ -30,7 +30,7 @@ namespace
{
public:
WebRequestThread(AdblockPlus::JsEnginePtr jsEngine, AdblockPlus::JsValueList& arguments)
- : Thread(true), jsEngine(jsEngine), url(arguments[0]->AsString())
+ : Thread(true), m_jsEngine(jsEngine), url(arguments[0]->AsString())
{
if (!url.length())
throw std::runtime_error("Invalid string passed as first argument to GET");
@@ -58,16 +58,16 @@ namespace
void Run()
{
- AdblockPlus::ServerResponse result = jsEngine->GetWebRequest()->GET(url, headers);
-
- AdblockPlus::JsContext context(jsEngine);
-
- AdblockPlus::JsValuePtr resultObject = jsEngine->NewObject();
+ // Don't keep a strong reference to JsEngine while request is being executed.
+ auto webRequest = AdblockPlus::Utils::lockJsEngine(m_jsEngine)->GetWebRequest();
Oleksandr 2016/11/25 10:38:04 Is there any reason why the line above is not usin
sergei 2016/11/25 12:04:46 Yes, it's in the comment. Let's say we have "locke
+ auto result = webRequest->GET(url, headers);
+ AdblockPlus::JsContext context(m_jsEngine);
+ AdblockPlus::JsValuePtr resultObject = context.jsEngine().NewObject();
resultObject->SetProperty("status", result.status);
resultObject->SetProperty("responseStatus", result.responseStatus);
resultObject->SetProperty("responseText", result.responseText);
- AdblockPlus::JsValuePtr headersObject = jsEngine->NewObject();
+ AdblockPlus::JsValuePtr headersObject = context.jsEngine().NewObject();
for (AdblockPlus::HeaderList::iterator it = result.responseHeaders.begin();
it != result.responseHeaders.end(); ++it)
{
@@ -81,7 +81,7 @@ namespace
}
private:
- AdblockPlus::JsEnginePtr jsEngine;
+ std::weak_ptr<AdblockPlus::JsEngine> m_jsEngine;
std::string url;
AdblockPlus::HeaderList headers;
AdblockPlus::JsValuePtr callback;

Powered by Google App Engine
This is Rietveld