Skip to content

Commit 97db68b

Browse files
committed
chore: custom remote function setup script in core
1 parent d4972e4 commit 97db68b

File tree

4 files changed

+122
-86
lines changed

4 files changed

+122
-86
lines changed

src/LiveDevelopment/MultiBrowserImpl/protocol/LiveDevProtocol.js

Lines changed: 17 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,16 @@ define(function (require, exports, module) {
8989
*/
9090
var _responseDeferreds = {};
9191

92+
let _remoteFunctionProvider = null;
93+
94+
/**
95+
* The callback fn must return a single text string that will be used as remote function script
96+
* @param callbackFn
97+
*/
98+
function setCustomRemoteFunctionProvider(callbackFn) {
99+
_remoteFunctionProvider = callbackFn;
100+
}
101+
92102
/**
93103
* Returns an array of the client IDs that are being managed by this live document.
94104
* @return {Array.<number>}
@@ -348,73 +358,6 @@ define(function (require, exports, module) {
348358
_transport.start();
349359
}
350360

351-
let remoteFunctionsScripts = new Map();
352-
let remoteFunctionsConstantsScripts = new Map();
353-
let effectiveRemoteFunctionsScripts = RemoteFunctions;
354-
355-
function _computeRemoteScript() {
356-
const remoteScriptText = Array.from(remoteFunctionsScripts.values()).join("\n");
357-
const remoteConstantScriptText = Array.from(remoteFunctionsConstantsScripts.values()).join("\n");
358-
effectiveRemoteFunctionsScripts = RemoteFunctions
359-
.replace("// DONT_STRIP_MINIFY:REPLACE_WITH_ADDED_REMOTE_CONSTANT_SCRIPTS", remoteConstantScriptText)
360-
.replace("// DONT_STRIP_MINIFY:REPLACE_WITH_ADDED_REMOTE_SCRIPTS", remoteScriptText);
361-
}
362-
363-
const JS_RESERVED_WORDS = new Set([
364-
"break","case","catch","class","const","continue","debugger","default",
365-
"delete","do","else","export","extends","finally","for","function",
366-
"if","import","in","instanceof","new","return","super","switch",
367-
"this","throw","try","typeof","var","void","while","with","yield",
368-
"enum","await","implements","interface","let","package","private",
369-
"protected","public","static"
370-
]);
371-
372-
function isValidFunctionName(name) {
373-
if (typeof name !== "string" || !name.length) {
374-
return false;
375-
}
376-
377-
// JS identifier syntax
378-
if (!/^[$A-Z_][0-9A-Z_$]*$/i.test(name)) {
379-
return false;
380-
}
381-
382-
// Reserved words
383-
return !JS_RESERVED_WORDS.has(name);
384-
}
385-
386-
387-
function addRemoteFunctionScript(scriptFunctionName, scriptText) {
388-
if(remoteFunctionsConstantsScripts.has(scriptFunctionName) || remoteFunctionsScripts.has(scriptFunctionName)){
389-
console.error(`Remote function script ${scriptFunctionName} already exists. Script wont be added.`);
390-
return false;
391-
}
392-
if(scriptFunctionName.length > 100 || !isValidFunctionName(scriptFunctionName)){
393-
console.error(`Script name ${scriptFunctionName} should be a valid function name.`);
394-
return false;
395-
}
396-
scriptText = `(function ${scriptFunctionName}(){${scriptText}})();`;
397-
remoteFunctionsScripts.set(scriptFunctionName, scriptText);
398-
if(!RemoteFunctions.includes("// DONT_STRIP_MINIFY:REPLACE_WITH_ADDED_REMOTE_SCRIPTS")){
399-
throw new Error("RemoteFunctions script is missing the placeholder // REPLACE_WITH_ADDED_REMOTE_SCRIPTS");
400-
}
401-
_computeRemoteScript();
402-
return true;
403-
}
404-
405-
function addRemoteFunctionConstantsScript(scriptName, scriptText) {
406-
if(remoteFunctionsConstantsScripts.has(scriptName) || remoteFunctionsScripts.has(scriptName)){
407-
console.error(`Remote function script ${scriptName} already exists. Script wont be added.`);
408-
return false;
409-
}
410-
remoteFunctionsConstantsScripts.set(scriptName, scriptText);
411-
if(!RemoteFunctions.includes("// DONT_STRIP_MINIFY:REPLACE_WITH_ADDED_REMOTE_CONSTANT_SCRIPTS")){
412-
throw new Error("RemoteFunctions script missing placeholder // REPLACE_WITH_ADDED_REMOTE_CONSTANT_SCRIPTS");
413-
}
414-
_computeRemoteScript();
415-
return true;
416-
}
417-
418361
/**
419362
* Returns a script that should be injected into the HTML that's launched in the
420363
* browser in order to implement remote commands that handle protocol requests.
@@ -426,8 +369,12 @@ define(function (require, exports, module) {
426369
// Inject DocumentObserver into the browser (tracks related documents)
427370
script += DocumentObserver;
428371
// Inject remote functions into the browser.
429-
script += "\nwindow._LD=(" + effectiveRemoteFunctionsScripts +
430-
"(" + JSON.stringify(LiveDevMultiBrowser.getConfig()) + "))";
372+
if(_remoteFunctionProvider){
373+
script += _remoteFunctionProvider();
374+
} else {
375+
script += "\nwindow._LD=(" + RemoteFunctions +
376+
"(" + JSON.stringify(LiveDevMultiBrowser.getConfig()) + "))";
377+
}
431378
return "\n" + script + "\n";
432379
}
433380

@@ -565,9 +512,8 @@ define(function (require, exports, module) {
565512
exports.close = close;
566513
exports.getConnectionIds = getConnectionIds;
567514
exports.closeAllConnections = closeAllConnections;
568-
exports.addRemoteFunctionScript = addRemoteFunctionScript;
569-
exports.addRemoteFunctionConstantsScript = addRemoteFunctionConstantsScript;
570515
exports.setLivePreviewMessageHandler = setLivePreviewMessageHandler;
516+
exports.setCustomRemoteFunctionProvider = setCustomRemoteFunctionProvider;
571517
exports.LIVE_DEV_REMOTE_SCRIPTS_FILE_NAME = LIVE_DEV_REMOTE_SCRIPTS_FILE_NAME;
572518
exports.LIVE_DEV_REMOTE_WORKER_SCRIPTS_FILE_NAME = LIVE_DEV_REMOTE_WORKER_SCRIPTS_FILE_NAME;
573519
exports.EVENT_LIVE_PREVIEW_CLICKED = EVENT_LIVE_PREVIEW_CLICKED;

src/extensionsIntegrated/phoenix-pro/main.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ define(function (require, exports, module) {
99
const remoteConstants = require("./remote-constants");
1010
const remoteIcons = require("./remote-icons");
1111
const remoteStyles = require("./remote-styles");
12+
const RemoteScriptProvider = require("./remote-script-provider");
1213

1314
const KernalModeTrust = window.KernalModeTrust;
1415
if(!KernalModeTrust){
@@ -24,30 +25,29 @@ define(function (require, exports, module) {
2425
const HotCornersCode = require("text!./browser-context/hot-corners.js");
2526
const GenericToolsCode = require("text!./browser-context/generic-tools.js");
2627
const ToastMessageCode = require("text!./browser-context/toast-message.js");
27-
const LiveDevProtocol = require("LiveDevelopment/MultiBrowserImpl/protocol/LiveDevProtocol");
2828

2929
function _addRemoteScripts() {
3030
// the ordering here is important
3131
// constants first
32-
LiveDevProtocol.addRemoteFunctionConstantsScript("strings",
32+
RemoteScriptProvider.addRemoteFunctionConstantsScript("strings",
3333
`strings = ${JSON.stringify(remoteConstants.remoteStrings)};`);
34-
LiveDevProtocol.addRemoteFunctionConstantsScript("proConstants",
34+
RemoteScriptProvider.addRemoteFunctionConstantsScript("proConstants",
3535
`proConstants = ${JSON.stringify(remoteConstants.proConstants)};`);
36-
LiveDevProtocol.addRemoteFunctionConstantsScript("icons",
36+
RemoteScriptProvider.addRemoteFunctionConstantsScript("icons",
3737
`icons = ${JSON.stringify(remoteIcons.svgIcons)};`);
38-
LiveDevProtocol.addRemoteFunctionConstantsScript("styles",
38+
RemoteScriptProvider.addRemoteFunctionConstantsScript("styles",
3939
`cssStyles = ${JSON.stringify(remoteStyles.cssStyles)};`);
4040

4141
// functions start here
42-
LiveDevProtocol.addRemoteFunctionScript("TextEditCode", TextEditCode);
43-
LiveDevProtocol.addRemoteFunctionScript("HyperlinkEditorCode", HyperlinkEditorCode);
44-
LiveDevProtocol.addRemoteFunctionScript("ImageGalleryCode", ImageGalleryCode);
45-
LiveDevProtocol.addRemoteFunctionScript("AICode", AICode);
46-
LiveDevProtocol.addRemoteFunctionScript("RulerLinesCode", RulerLinesCode);
47-
LiveDevProtocol.addRemoteFunctionScript("DragAndDrop", DragAndDropCode);
48-
LiveDevProtocol.addRemoteFunctionScript("HotCornersCode", HotCornersCode);
49-
LiveDevProtocol.addRemoteFunctionScript("GenericTools", GenericToolsCode);
50-
LiveDevProtocol.addRemoteFunctionScript("ToastMessageCode", ToastMessageCode);
42+
RemoteScriptProvider.addRemoteFunctionScript("TextEditCode", TextEditCode);
43+
RemoteScriptProvider.addRemoteFunctionScript("HyperlinkEditorCode", HyperlinkEditorCode);
44+
RemoteScriptProvider.addRemoteFunctionScript("ImageGalleryCode", ImageGalleryCode);
45+
RemoteScriptProvider.addRemoteFunctionScript("AICode", AICode);
46+
RemoteScriptProvider.addRemoteFunctionScript("RulerLinesCode", RulerLinesCode);
47+
RemoteScriptProvider.addRemoteFunctionScript("DragAndDrop", DragAndDropCode);
48+
RemoteScriptProvider.addRemoteFunctionScript("HotCornersCode", HotCornersCode);
49+
RemoteScriptProvider.addRemoteFunctionScript("GenericTools", GenericToolsCode);
50+
RemoteScriptProvider.addRemoteFunctionScript("ToastMessageCode", ToastMessageCode);
5151
}
5252
_addRemoteScripts();
5353
});
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
* Copyright (c) 2021 - present core.ai
3+
* SPDX-License-Identifier: LicenseRef-Proprietary
4+
*/
5+
6+
define(function (require, exports, module) {
7+
const LiveDevProtocol = require("LiveDevelopment/MultiBrowserImpl/protocol/LiveDevProtocol");
8+
const LiveDevMultiBrowser = require("LiveDevelopment/LiveDevMultiBrowser");
9+
const RemoteFunctions = require("text!LiveDevelopment/BrowserScripts/RemoteFunctions.js");
10+
11+
let remoteFunctionsScripts = new Map();
12+
let remoteFunctionsConstantsScripts = new Map();
13+
let effectiveRemoteFunctionsScripts = RemoteFunctions;
14+
15+
function _computeRemoteScript() {
16+
const remoteScriptText = Array.from(remoteFunctionsScripts.values()).join("\n");
17+
const remoteConstantScriptText = Array.from(remoteFunctionsConstantsScripts.values()).join("\n");
18+
effectiveRemoteFunctionsScripts = RemoteFunctions
19+
.replace("// DONT_STRIP_MINIFY:REPLACE_WITH_ADDED_REMOTE_CONSTANT_SCRIPTS", remoteConstantScriptText)
20+
.replace("// DONT_STRIP_MINIFY:REPLACE_WITH_ADDED_REMOTE_SCRIPTS", remoteScriptText);
21+
}
22+
23+
const JS_RESERVED_WORDS = new Set([
24+
"break","case","catch","class","const","continue","debugger","default",
25+
"delete","do","else","export","extends","finally","for","function",
26+
"if","import","in","instanceof","new","return","super","switch",
27+
"this","throw","try","typeof","var","void","while","with","yield",
28+
"enum","await","implements","interface","let","package","private",
29+
"protected","public","static"
30+
]);
31+
32+
function isValidFunctionName(name) {
33+
if (typeof name !== "string" || !name.length) {
34+
return false;
35+
}
36+
37+
// JS identifier syntax
38+
if (!/^[$A-Z_][0-9A-Z_$]*$/i.test(name)) {
39+
return false;
40+
}
41+
42+
// Reserved words
43+
return !JS_RESERVED_WORDS.has(name);
44+
}
45+
46+
47+
function addRemoteFunctionScript(scriptFunctionName, scriptText) {
48+
if(remoteFunctionsConstantsScripts.has(scriptFunctionName) || remoteFunctionsScripts.has(scriptFunctionName)){
49+
console.error(`Remote function script ${scriptFunctionName} already exists. Script wont be added.`);
50+
return false;
51+
}
52+
if(scriptFunctionName.length > 100 || !isValidFunctionName(scriptFunctionName)){
53+
console.error(`Script name ${scriptFunctionName} should be a valid function name.`);
54+
return false;
55+
}
56+
scriptText = `(function ${scriptFunctionName}(){${scriptText}})();`;
57+
scriptText = `eval(${JSON.stringify(scriptText)});`;
58+
remoteFunctionsScripts.set(scriptFunctionName, scriptText);
59+
if(!RemoteFunctions.includes("// DONT_STRIP_MINIFY:REPLACE_WITH_ADDED_REMOTE_SCRIPTS")){
60+
throw new Error("RemoteFunctions script is missing the placeholder // REPLACE_WITH_ADDED_REMOTE_SCRIPTS");
61+
}
62+
_computeRemoteScript();
63+
return true;
64+
}
65+
66+
function addRemoteFunctionConstantsScript(scriptName, scriptText) {
67+
if(remoteFunctionsConstantsScripts.has(scriptName) || remoteFunctionsScripts.has(scriptName)){
68+
console.error(`Remote function script ${scriptName} already exists. Script wont be added.`);
69+
return false;
70+
}
71+
remoteFunctionsConstantsScripts.set(scriptName, scriptText);
72+
if(!RemoteFunctions.includes("// DONT_STRIP_MINIFY:REPLACE_WITH_ADDED_REMOTE_CONSTANT_SCRIPTS")){
73+
throw new Error("RemoteFunctions script missing placeholder // REPLACE_WITH_ADDED_REMOTE_CONSTANT_SCRIPTS");
74+
}
75+
_computeRemoteScript();
76+
return true;
77+
}
78+
LiveDevProtocol.setCustomRemoteFunctionProvider(()=>{
79+
const effectiveScript = "window._LD=(" + effectiveRemoteFunctionsScripts +
80+
"(" + JSON.stringify(LiveDevMultiBrowser.getConfig()) + "))";
81+
return `eval(${JSON.stringify(effectiveScript)})`;
82+
});
83+
84+
exports.addRemoteFunctionConstantsScript = addRemoteFunctionConstantsScript;
85+
exports.addRemoteFunctionScript = addRemoteFunctionScript;
86+
});

src/extensionsIntegrated/phoenix-pro/unit-tests/LivePreviewEdit-test.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,11 @@ define(function (require, exports, module) {
234234
function () {
235235
LiveDevProtocol.evaluate(script)
236236
.done((response) => {
237-
result = JSON.parse(response.result || "");
237+
try{
238+
result = response.result && JSON.parse(response.result || "");
239+
} catch (e) {
240+
console.error(`JSON parse failed for ${response.result}`, e);
241+
}
238242
});
239243
if (compareFn) {
240244
return compareFn(result);

0 commit comments

Comments
 (0)