Skip to content

Commit 746d710

Browse files
authored
fix(Console): Leverage existing console polyfill from react-native (microsoft#934)
react-native provides a console polyfill if you expose a global function called `nativeLoggingHook` that takes two parameters, a message and a log level. This polyfill contains logic to format calls to console.table, and also future proofs us for new console methods that are polyfilled. Fixes microsoft#933
1 parent 51c6e2a commit 746d710

3 files changed

Lines changed: 23 additions & 109 deletions

File tree

ReactWindows/ReactNative.Shared/Chakra/Executor/ChakraJavaScriptExecutor.cs

Lines changed: 12 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@ public sealed class ChakraJavaScriptExecutor : IJavaScriptExecutor
2121

2222
private JavaScriptSourceContext _context;
2323

24-
private JavaScriptNativeFunction _consoleInfo;
25-
private JavaScriptNativeFunction _consoleLog;
26-
private JavaScriptNativeFunction _consoleWarn;
27-
private JavaScriptNativeFunction _consoleError;
24+
private JavaScriptNativeFunction _nativeLoggingHook;
2825

2926
private JavaScriptValue _globalObject;
3027

@@ -212,24 +209,11 @@ private void InitializeChakra()
212209
{
213210
JavaScriptContext.Current = _runtime.CreateContext();
214211

215-
var consolePropertyId = default(JavaScriptPropertyId);
216-
Native.ThrowIfError(
217-
Native.JsGetPropertyIdFromName("console", out consolePropertyId));
218-
219-
var consoleObject = JavaScriptValue.CreateObject();
220-
EnsureGlobalObject().SetProperty(consolePropertyId, consoleObject, true);
221-
222-
_consoleInfo = ConsoleInfo;
223-
_consoleLog = ConsoleLog;
224-
_consoleWarn = ConsoleWarn;
225-
_consoleError = ConsoleError;
226-
227-
DefineHostCallback(consoleObject, "info", _consoleInfo);
228-
DefineHostCallback(consoleObject, "log", _consoleLog);
229-
DefineHostCallback(consoleObject, "warn", _consoleWarn);
230-
DefineHostCallback(consoleObject, "error", _consoleError);
231-
232-
Debug.WriteLine("Chakra initialization successful.");
212+
_nativeLoggingHook = NativeLoggingHook;
213+
EnsureGlobalObject().SetProperty(
214+
JavaScriptPropertyId.FromString("nativeLoggingHook"),
215+
JavaScriptValue.CreateFunction(_nativeLoggingHook),
216+
true);
233217
}
234218

235219
#region JSON Marshaling
@@ -270,59 +254,7 @@ private JToken ConvertJson(JavaScriptValue value)
270254
#endregion
271255

272256
#region Console Callbacks
273-
274-
private static void DefineHostCallback(
275-
JavaScriptValue obj,
276-
string callbackName,
277-
JavaScriptNativeFunction callback)
278-
{
279-
var propertyId = JavaScriptPropertyId.FromString(callbackName);
280-
var function = JavaScriptValue.CreateFunction(callback);
281-
obj.SetProperty(propertyId, function, true);
282-
}
283-
284-
private JavaScriptValue ConsoleInfo(
285-
JavaScriptValue callee,
286-
bool isConstructCall,
287-
JavaScriptValue[] arguments,
288-
ushort argumentCount,
289-
IntPtr callbackData)
290-
{
291-
return ConsoleCallback("Info", callee, isConstructCall, arguments, argumentCount, callbackData);
292-
}
293-
294-
private JavaScriptValue ConsoleLog(
295-
JavaScriptValue callee,
296-
bool isConstructCall,
297-
JavaScriptValue[] arguments,
298-
ushort argumentCount,
299-
IntPtr callbackData)
300-
{
301-
return ConsoleCallback("Log", callee, isConstructCall, arguments, argumentCount, callbackData);
302-
}
303-
304-
private JavaScriptValue ConsoleWarn(
305-
JavaScriptValue callee,
306-
bool isConstructCall,
307-
JavaScriptValue[] arguments,
308-
ushort argumentCount,
309-
IntPtr callbackData)
310-
{
311-
return ConsoleCallback("Warn", callee, isConstructCall, arguments, argumentCount, callbackData);
312-
}
313-
314-
private JavaScriptValue ConsoleError(
315-
JavaScriptValue callee,
316-
bool isConstructCall,
317-
JavaScriptValue[] arguments,
318-
ushort argumentCount,
319-
IntPtr callbackData)
320-
{
321-
return ConsoleCallback("Error", callee, isConstructCall, arguments, argumentCount, callbackData);
322-
}
323-
324-
private JavaScriptValue ConsoleCallback(
325-
string kind,
257+
private JavaScriptValue NativeLoggingHook(
326258
JavaScriptValue callee,
327259
bool isConstructCall,
328260
JavaScriptValue[] arguments,
@@ -331,46 +263,17 @@ private JavaScriptValue ConsoleCallback(
331263
{
332264
try
333265
{
334-
Debug.Write(Invariant($"[JS {kind}]"));
335-
336-
// First argument is this-context, ignore...
337-
for (var i = 1; i < argumentCount; ++i)
338-
{
339-
Debug.Write(Stringify(arguments[i]) + " ");
340-
}
341-
342-
Debug.WriteLine("");
266+
var message = arguments[1].ToString();
267+
var logLevel = (LogLevel)(int)arguments[2].ToDouble();
268+
Debug.Write($"[JS {logLevel}] {message}");
343269
}
344-
catch (Exception ex)
270+
catch
345271
{
346-
Debug.WriteLine(Invariant($"Error in ChakraExecutor.ConsoleCallback: {ex.Message}"));
272+
Debug.Write("Unable to process JavaScript console statement");
347273
}
348274

349275
return JavaScriptValue.Undefined;
350276
}
351-
352-
private string Stringify(JavaScriptValue value)
353-
{
354-
switch (value.ValueType)
355-
{
356-
case JavaScriptValueType.Undefined:
357-
case JavaScriptValueType.Null:
358-
case JavaScriptValueType.Number:
359-
case JavaScriptValueType.String:
360-
case JavaScriptValueType.Boolean:
361-
case JavaScriptValueType.Object:
362-
case JavaScriptValueType.Array:
363-
case JavaScriptValueType.TypedArray:
364-
return ConvertJson(value).ToString(Formatting.None);
365-
case JavaScriptValueType.Function:
366-
case JavaScriptValueType.Error:
367-
case JavaScriptValueType.Symbol:
368-
case JavaScriptValueType.ArrayBuffer:
369-
return value.ConvertToString().ToString();
370-
default:
371-
throw new NotImplementedException();
372-
}
373-
}
374277
#endregion
375278

376279
#region Global Helpers
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace ReactNative.Chakra.Executor
2+
{
3+
enum LogLevel
4+
{
5+
Trace = 0,
6+
Info = 1,
7+
Warn = 2,
8+
Error = 3,
9+
}
10+
}

ReactWindows/ReactNative.Shared/ReactNative.Shared.projitems

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
<Compile Include="$(MSBuildThisFileDirectory)Chakra\Executor\ChakraJavaScriptExecutor.cs" />
7171
<Compile Include="$(MSBuildThisFileDirectory)Chakra\Executor\JavaScriptValueToJTokenConverter.cs" />
7272
<Compile Include="$(MSBuildThisFileDirectory)Chakra\Executor\JTokenToJavaScriptValueConverter.cs" />
73+
<Compile Include="$(MSBuildThisFileDirectory)Chakra\Executor\LogLevel.cs" />
7374
<Compile Include="$(MSBuildThisFileDirectory)Chakra\JavaScriptBackgroundWorkItemCallback.cs" />
7475
<Compile Include="$(MSBuildThisFileDirectory)Chakra\JavaScriptBeforeCollectCallback.cs" />
7576
<Compile Include="$(MSBuildThisFileDirectory)Chakra\JavaScriptContext.cs" />

0 commit comments

Comments
 (0)