Skip to content

Commit ffbd2d9

Browse files
authored
Merge pull request #123 from rdkcentral/topic/RDKEMW-13250
RDKEMW-13250: Memory Metrics analysis for VIPA
2 parents 7b4569c + de253bf commit ffbd2d9

7 files changed

Lines changed: 166 additions & 7 deletions

File tree

include/ModuleSettings.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,6 @@ struct ModuleSettings
3434
bool enableJSDOM;
3535
bool enableWindow;
3636
bool enablePlayer;
37+
bool enableMiniJSDOM;
3738
};
3839
#endif

include/NativeJSRenderer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ namespace JsRuntime {
9595

9696
struct ApplicationRequest
9797
{
98-
ApplicationRequest(uint32_t id, RequestType requestType, std::string url="", bool enableHttp=false, bool enableXHR=false, bool enableWebSocket=false, bool enableWebSocketEnhanced=false, bool enableFetch=false, bool enableJSDOM=false, bool enableWindow=false, bool enablePlayer=false, std::string userAgent=""): mId(id), mRequestType(requestType), mUrl(url), mEnableHttp(enableHttp), mEnableXHR(enableXHR), mEnableWebSocket(enableWebSocket), mEnableWebSocketEnhanced(enableWebSocketEnhanced), mEnableFetch(enableFetch), mEnableJSDOM(enableJSDOM), mEnableWindow(enableWindow), mEnablePlayer(enablePlayer), mUserAgent(userAgent)
98+
ApplicationRequest(uint32_t id, RequestType requestType, std::string url="", bool enableHttp=false, bool enableXHR=false, bool enableWebSocket=false, bool enableWebSocketEnhanced=false, bool enableFetch=false, bool enableJSDOM=false, bool enableWindow=false, bool enablePlayer=false, bool enableMiniJSDOM=false, std::string userAgent=""): mId(id), mRequestType(requestType), mUrl(url), mEnableHttp(enableHttp), mEnableXHR(enableXHR), mEnableWebSocket(enableWebSocket), mEnableWebSocketEnhanced(enableWebSocketEnhanced), mEnableFetch(enableFetch), mEnableJSDOM(enableJSDOM), mEnableWindow(enableWindow), mEnablePlayer(enablePlayer), mEnableMiniJSDOM(enableMiniJSDOM), mUserAgent(userAgent)
9999
{
100100
}
101101
uint32_t mId;
@@ -109,6 +109,7 @@ namespace JsRuntime {
109109
bool mEnableJSDOM;
110110
bool mEnableWindow;
111111
bool mEnablePlayer;
112+
bool mEnableMiniJSDOM;
112113
std::string mUserAgent;
113114

114115
};

src/ModuleSettings.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#include <ModuleSettings.h>
2020

2121
ModuleSettings::ModuleSettings(): enableHttp(false), enableXHR(false), enableWebSocket(false), enableWebSocketEnhanced(false)
22-
, enableFetch(false), enableJSDOM(false), enableWindow(false), enablePlayer(false)
22+
, enableFetch(false), enableJSDOM(false), enableWindow(false), enablePlayer(false), enableMiniJSDOM(false)
2323
{
2424
}
2525

@@ -30,7 +30,8 @@ ModuleSettings::ModuleSettings(ModuleSettings& settings): enableHttp(settings.en
3030
enableFetch(settings.enableFetch),
3131
enableJSDOM(settings.enableJSDOM),
3232
enableWindow(settings.enableWindow),
33-
enablePlayer(settings.enablePlayer)
33+
enablePlayer(settings.enablePlayer),
34+
enableMiniJSDOM(settings.enableMiniJSDOM)
3435
{
3536
}
3637

@@ -56,7 +57,11 @@ void ModuleSettings::fromString(std::string& options)
5657
{
5758
enableFetch = true;
5859
}
59-
if (options.find("jsdom") != std::string::npos)
60+
if (options.find("minijsdom") != std::string::npos)
61+
{
62+
enableMiniJSDOM = true;
63+
}
64+
else if (options.find("jsdom") != std::string::npos)
6065
{
6166
enableJSDOM = true;
6267
}
@@ -67,5 +72,5 @@ void ModuleSettings::fromString(std::string& options)
6772
if (options.find("player") != std::string::npos)
6873
{
6974
enablePlayer = true;
70-
}
75+
}
7176
}

src/NativeJSRenderer.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ uint32_t NativeJSRenderer::createApplication(ModuleSettings& moduleSettings, st
235235
uint32_t id=0;
236236
mUserMutex.lock();
237237
id = createApplicationIdentifier();
238-
ApplicationRequest request(id, CREATE, "", moduleSettings.enableHttp, moduleSettings.enableXHR, moduleSettings.enableWebSocket, moduleSettings.enableWebSocketEnhanced, moduleSettings.enableFetch, moduleSettings.enableJSDOM, moduleSettings.enableWindow, moduleSettings.enablePlayer, userAgent);
238+
ApplicationRequest request(id, CREATE, "", moduleSettings.enableHttp, moduleSettings.enableXHR, moduleSettings.enableWebSocket, moduleSettings.enableWebSocketEnhanced, moduleSettings.enableFetch, moduleSettings.enableJSDOM, moduleSettings.enableWindow, moduleSettings.enablePlayer, moduleSettings.enableMiniJSDOM, userAgent);
239239
gPendingRequests.push_back(request);
240240
mUserMutex.unlock();
241241
return id;
@@ -305,6 +305,7 @@ void NativeJSRenderer::createApplicationInternal(ApplicationRequest& appRequest)
305305
settings.enableJSDOM = appRequest.mEnableJSDOM;
306306
settings.enableWindow = appRequest.mEnableWindow;
307307
settings.enablePlayer = appRequest.mEnablePlayer;
308+
settings.enableMiniJSDOM = appRequest.mEnableMiniJSDOM;
308309
uint32_t id= appRequest.mId;
309310
std::string userAgent = appRequest.mUserAgent;
310311
JavaScriptContextFeatures features(mEmbedThunderJS, mEmbedRdkWebBridge, mEnableWebSocketServer, settings);
@@ -509,7 +510,7 @@ void NativeJSRenderer::run()
509510
ModuleSettings settings;
510511
uint32_t id = createApplicationIdentifier();
511512
settings.enableJSDOM = mEnableTestFileDOMSupport;
512-
ApplicationRequest appRequest(id, RUN, mTestFileName, settings.enableHttp, settings.enableXHR, settings.enableWebSocket, settings.enableWebSocketEnhanced, settings.enableFetch, settings.enableJSDOM, settings.enableWindow, settings.enablePlayer);
513+
ApplicationRequest appRequest(id, RUN, mTestFileName, settings.enableHttp, settings.enableXHR, settings.enableWebSocket, settings.enableWebSocketEnhanced, settings.enableFetch, settings.enableJSDOM, settings.enableWindow, settings.enablePlayer, settings.enableMiniJSDOM);
513514
mUserMutex.lock();
514515
NativeJSRenderer::createApplicationInternal(appRequest);
515516
NativeJSRenderer::runApplicationInternal(appRequest);

src/jsc/JavaScriptContext.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,12 @@ if (mModuleSettings.enablePlayer)
466466
runFile("linkedjsdomwrapper.js", nullptr/*, true*/);
467467
runFile("windowwrapper.js", nullptr/*, true*/);
468468
runFile("url.js", nullptr/*, true*/);
469+
470+
}
471+
else if (mModuleSettings.enableMiniJSDOM)
472+
{
473+
runFile("minified_linkedjsdom.js", nullptr/*, true*/);
474+
runFile("url.js", nullptr/*, true*/);
469475
if(getenv("FIREBOLT_ENDPOINT")!=NULL)
470476
{
471477
auto FireboltEndpoint = std::string(getenv("FIREBOLT_ENDPOINT"));
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
var document = {
2+
createElement: function() {
3+
return {
4+
style: {},
5+
setAttribute: function() {},
6+
getAttribute: function() { return null; },
7+
hasAttribute: function() { return false; },
8+
appendChild: function(c) { return c; },
9+
removeChild: function(c) { return c; },
10+
addEventListener: function() {},
11+
getBoundingClientRect: function() { return {top:0,left:0,right:0,bottom:0,width:0,height:0,x:0,y:0}; }
12+
};
13+
},
14+
createEvent: function(type) {
15+
return {
16+
initEvent: function(t, bubbles, cancelable) { this.type = t; this.bubbles = bubbles; this.cancelable = cancelable; },
17+
type: '',
18+
bubbles: false,
19+
cancelable: false,
20+
preventDefault: function() {}
21+
};
22+
},
23+
getElementById: function(id) { return id === 'videoDiv' ? this.createElement() : null; },
24+
querySelector: function(s) { return s === '#videoDiv' ? this.getElementById('videoDiv') : null; },
25+
body: { appendChild: function(c) { return c; } },
26+
head: { appendChild: function(c) { return c; } }
27+
};
28+
29+
function Event(t) { this.type = t; }
30+
Event.prototype.preventDefault = function() {};
31+
32+
function DOMParser() {}
33+
DOMParser.prototype.parseFromString = function() { return document; };
34+
35+
function Blob(parts, options) { this.size = 0; this.type = (options && options.type) || ''; }
36+
Blob.prototype.slice = function() { return new Blob([], {}); };
37+
38+
// AbortController for fetch API
39+
function AbortController() {
40+
this.signal = { aborted: false, addEventListener: function() {} };
41+
}
42+
AbortController.prototype.abort = function() {
43+
this.signal.aborted = true;
44+
};
45+
46+
// Minimal fetch stub
47+
function fetch(url, options) {
48+
return new Promise(function(resolve, reject) {
49+
if (options && options.signal && options.signal.aborted) {
50+
var error = new Error('Aborted');
51+
error.name = 'AbortError';
52+
reject(error);
53+
return;
54+
}
55+
// Stub response
56+
resolve({
57+
ok: true,
58+
status: 200,
59+
json: function() { return Promise.resolve({}); },
60+
text: function() { return Promise.resolve(''); },
61+
blob: function() { return Promise.resolve(new Blob([], {})); }
62+
});
63+
});
64+
}
65+
66+
// Wrap timer functions to ensure .apply() works
67+
var _setTimeout = setTimeout;
68+
var _setInterval = setInterval;
69+
var _clearTimeout = clearTimeout;
70+
var _clearInterval = clearInterval;
71+
72+
function wrappedSetTimeout(fn, delay) {
73+
var args = Array.prototype.slice.call(arguments, 2);
74+
return _setTimeout(function() { fn.apply(null, args); }, delay);
75+
}
76+
wrappedSetTimeout.apply = function(thisArg, argArray) {
77+
if (!argArray || argArray.length === 0) return _setTimeout();
78+
if (argArray.length === 1) return _setTimeout(argArray[0]);
79+
if (argArray.length === 2) return _setTimeout(argArray[0], argArray[1]);
80+
var args = Array.prototype.slice.call(argArray, 2);
81+
return _setTimeout(function() { argArray[0].apply(null, args); }, argArray[1]);
82+
};
83+
84+
function wrappedSetInterval(fn, delay) {
85+
var args = Array.prototype.slice.call(arguments, 2);
86+
return _setInterval(function() { fn.apply(null, args); }, delay);
87+
}
88+
wrappedSetInterval.apply = function(thisArg, argArray) {
89+
if (!argArray || argArray.length === 0) return _setInterval();
90+
if (argArray.length === 1) return _setInterval(argArray[0]);
91+
if (argArray.length === 2) return _setInterval(argArray[0], argArray[1]);
92+
var args = Array.prototype.slice.call(argArray, 2);
93+
return _setInterval(function() { argArray[0].apply(null, args); }, argArray[1]);
94+
};
95+
96+
function wrappedClearTimeout(id) { return _clearTimeout(id); }
97+
wrappedClearTimeout.apply = function(thisArg, argArray) {
98+
return _clearTimeout(argArray ? argArray[0] : undefined);
99+
};
100+
101+
function wrappedClearInterval(id) { return _clearInterval(id); }
102+
wrappedClearInterval.apply = function(thisArg, argArray) {
103+
return _clearInterval(argArray ? argArray[0] : undefined);
104+
};
105+
106+
var window = {
107+
document: document,
108+
location: {href:'',host:'127.0.0.1',hostname:'127.0.0.1'},
109+
navigator: {userAgent:'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36',platform:'Linux'},
110+
console: console,
111+
setTimeout: wrappedSetTimeout,
112+
setInterval: wrappedSetInterval,
113+
clearTimeout: wrappedClearTimeout,
114+
clearInterval: wrappedClearInterval,
115+
addEventListener: function() {},
116+
Event: Event,
117+
DOMParser: DOMParser,
118+
Blob: Blob,
119+
AbortController: AbortController,
120+
fetch: fetch,
121+
Promise: Promise
122+
};
123+
124+
window.window = window;
125+
window.self = window;
126+
var navigator = window.navigator;
127+
var location = window.location;
128+
window.top = window;
129+
var tv = window.tv = {};
130+
var DOMParser = window.DOMParser;
131+
var Event = window.Event;
132+
var Blob = window.Blob;
133+
var AbortController = window.AbortController;
134+
var fetch = window.fetch;
135+
var Promise = window.Promise;
136+
var top = window;
137+
var setTimeout = wrappedSetTimeout;
138+
var setInterval = wrappedSetInterval;
139+
var clearTimeout = wrappedClearTimeout;
140+
var clearInterval = wrappedClearInterval;
141+
var LinkedJSDOMLib = {parseHTML: function() { return {window:window,document:document,defaultView:window}; }};

src/jsruntime.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ int main(int argc, char* argv[])
128128
{
129129
moduleSettings.enablePlayer = true;
130130
}
131+
else if (strcmp(argv[i], "--enableMiniJSDOM") == 0)
132+
{
133+
moduleSettings.enableMiniJSDOM = true;
134+
}
131135
else if (strcmp(argv[i], "--console") == 0)
132136
{
133137
consoleMode = true;

0 commit comments

Comments
 (0)