jsinterop-generator icon indicating copy to clipboard operation
jsinterop-generator copied to clipboard

Global scope is always assumed to be "window"

Open niloc132 opened this issue 5 years ago • 4 comments

ModelHelper.createGlobalJavaType always assumes that window is the correct name to use:

  public static Type createGlobalJavaType(String packagePrefix, String globalScopeClassName) {
    Type type = new Type(NAMESPACE);
    type.setName(globalScopeClassName);
    type.setPackageName(packagePrefix);
    type.setNativeNamespace(GLOBAL_NAMESPACE);
    type.addAnnotation(
        builder()
            .type(JS_TYPE)
            .isNativeAttribute(true)
            .namespaceAttribute("")
            .nameAttribute("window")
            .build());
    return type;
  }

However, this is only correct in a case like DomGlobal, which only makes sense in a normal window context. For classes like Global, this should instead be something like self, so that it works both in windows and in workers (as well as other non-browser JS contexts).

My proposal would be to change this to invoke nameAttribute("self"), since that seems as though it should be valid in window and worker contexts alike (see [1], [2]), but perhaps there is a better, more flexible solution?

[1] https://developer.mozilla.org/en-US/docs/Web/API/Window/self [2] https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/self

In the mean time, objects in Global can't be used. Workarounds for others who find this:

  • For Symbol, make your own jstype to represent it, with a static function instead of a constructor to create it
  • For JSON, make your own JSONType with static methods instead of instance methods
  • For NaN/Infinity/undefined and other global methods, use your own static @JsProperty-annotated fields.

In all of these cases, JsPackage.GLOBAL should be used as the namespace to avoid needing to reference window.

niloc132 avatar Feb 12 '19 13:02 niloc132

goog.global is the replacement. self unfortunately doesn't work in node.js environments. We added goog.global to GWT earlier so we could update the code generation. (https://github.com/gwtproject/gwt/blob/4825d47eee7505346de372a159db55b18b006a2a).

gkdn avatar Feb 12 '19 18:02 gkdn

the link seems to be broken.

vegegoku avatar Feb 12 '19 20:02 vegegoku

https://github.com/gwtproject/gwt/commit/4825d47eee7505346de372a159db55b18b006a2a

tbroyer avatar Feb 12 '19 20:02 tbroyer

I would love to see a java constant added for this name such as JsType.GLOBAL with a little comment to indicate what it does. Although then we have both JsType.GLOBAL and JsType.GLOBAL. Maybe we should use the unfortunate naming convention adopted by TC39 ala JsType.GLOBAL_THIS. See https://github.com/tc39/proposal-global and https://github.com/tc39/proposal-global/blob/master/NAMING.md

realityforge avatar Feb 12 '19 21:02 realityforge