-
Notifications
You must be signed in to change notification settings - Fork 42
Description
Blob.java declares lastModifiedDate as public String in a @jstype(isNative=true) class:
@JsType(isNative = true, name = "Blob", namespace = JsPackage.GLOBAL)
public class Blob {
@JsProperty
public String lastModifiedDate;
// ...
}However, the browser's File.lastModifiedDate returns a JS Date object, not a string. This type mismatch has always been present but was harmless until GWT 2.13.
What breaks in GWT 2.13:
GWT 2.13 added CharSequence.isEmpty() as a default method (gwtproject/gwt#10091). The devirtualizer now emits a runtime instanceOfString check:
// Generated JS for isEmpty() call in convertUploadFile()
instanceOfString(this$static)
? String.$isEmpty(this$static) // string path
: this$static.isEmpty__Z(); // non-string path ← crashes hereSince file.lastModifiedDate is a JS Date at runtime, typeof date === 'string' is false, and Date.isEmpty__Z() doesn't exist → TypeError.
The crash occurs in MaterialFileUploader.convertUploadFile():
if (file.lastModifiedDate != null && !file.lastModifiedDate.isEmpty()) {
lastModifiedDate = new Date(file.lastModifiedDate);
}Additional note: File.lastModifiedDate is deprecated in the browser API. The modern replacement is File.lastModified which returns a numeric timestamp (milliseconds since epoch).
Suggested fix:
Replace the String lastModifiedDate field in Blob.java with the modern numeric API, and update convertUploadFile():
// In Blob.java — replace:
// public String lastModifiedDate;
// with:
@JsProperty
public double lastModified;// In MaterialFileUploader.convertUploadFile() — replace the date parsing with:
Date lastModifiedDate = new Date((long) file.lastModified);This uses the modern, non-deprecated browser API and avoids calling any Java String methods on native JS values.
Environment: GWT 2.13.0, gwt-material-addins 2.8.5
Ref: gwtproject/gwt#10298