[HTML5] Add PWA support to the editor page.
This allows to install it as an app, and provide offline support (after the first run). Practically, this boils down to adding a JSON file as a manifest, an offline page to be displayed when the cached files are not avaialble, and a JS file to cache resources and return them. The reason for the "first run requirements" is that some browsers, will emit an "install" by just visiting the page (to see if the JS code is compatibile), and we do not want to force casual visitors to just download the 10 MiB+ compressed editor WebAssembly file without pressing the start button. Special thanks to Hugo Locurcio (Calinou) for the initial work.
This commit is contained in:
@ -86,40 +86,6 @@ wrap_list = [
|
||||
]
|
||||
js_wrapped = env.Textfile("#bin/godot", [env.File(f) for f in wrap_list], TEXTFILESUFFIX="${PROGSUFFIX}.wrapped.js")
|
||||
|
||||
zip_dir = env.Dir("#bin/.javascript_zip")
|
||||
binary_name = "godot.tools" if env["tools"] else "godot"
|
||||
out_files = [
|
||||
zip_dir.File(binary_name + ".js"),
|
||||
zip_dir.File(binary_name + ".wasm"),
|
||||
zip_dir.File(binary_name + ".html"),
|
||||
zip_dir.File(binary_name + ".audio.worklet.js"),
|
||||
]
|
||||
html_file = "#misc/dist/html/full-size.html"
|
||||
if env["tools"]:
|
||||
subst_dict = {"@GODOT_VERSION@": env.GetBuildVersion()}
|
||||
html_file = env.Substfile(
|
||||
target="#bin/godot${PROGSUFFIX}.html", source="#misc/dist/html/editor.html", SUBST_DICT=subst_dict
|
||||
)
|
||||
|
||||
in_files = [js_wrapped, build[1], html_file, "#platform/javascript/js/libs/audio.worklet.js"]
|
||||
if env["gdnative_enabled"]:
|
||||
in_files.append(build[2]) # Runtime
|
||||
out_files.append(zip_dir.File(binary_name + ".side.wasm"))
|
||||
elif env["threads_enabled"]:
|
||||
in_files.append(build[2]) # Worker
|
||||
out_files.append(zip_dir.File(binary_name + ".worker.js"))
|
||||
|
||||
if env["tools"]:
|
||||
in_files.append("#misc/dist/html/logo.svg")
|
||||
out_files.append(zip_dir.File("logo.svg"))
|
||||
in_files.append("#icon.png")
|
||||
out_files.append(zip_dir.File("favicon.png"))
|
||||
|
||||
zip_files = env.InstallAs(out_files, in_files)
|
||||
env.Zip(
|
||||
"#bin/godot",
|
||||
zip_files,
|
||||
ZIPROOT=zip_dir,
|
||||
ZIPSUFFIX="${PROGSUFFIX}${ZIPSUFFIX}",
|
||||
ZIPCOMSTR="Archiving $SOURCES as $TARGET",
|
||||
)
|
||||
# Extra will be the thread worker, or the GDNative side, or None
|
||||
extra = build[2] if len(build) > 2 else None
|
||||
env.CreateTemplateZip(js_wrapped, build[1], extra)
|
||||
|
||||
@ -7,7 +7,7 @@ from emscripten_helpers import (
|
||||
add_js_libraries,
|
||||
add_js_pre,
|
||||
add_js_externs,
|
||||
get_build_version,
|
||||
create_template_zip,
|
||||
)
|
||||
from methods import get_compiler_version
|
||||
from SCons.Util import WhereIs
|
||||
@ -147,12 +147,12 @@ def configure(env):
|
||||
env.AddMethod(add_js_pre, "AddJSPre")
|
||||
env.AddMethod(add_js_externs, "AddJSExterns")
|
||||
|
||||
# Add method for getting build version string.
|
||||
env.AddMethod(get_build_version, "GetBuildVersion")
|
||||
|
||||
# Add method that joins/compiles our Engine files.
|
||||
env.AddMethod(create_engine_file, "CreateEngineFile")
|
||||
|
||||
# Add method for creating the final zip file
|
||||
env.AddMethod(create_template_zip, "CreateTemplateZip")
|
||||
|
||||
# Closure compiler extern and support for ecmascript specs (const, let, etc).
|
||||
env["ENV"]["EMCC_CLOSURE_ARGS"] = "--language_in ECMASCRIPT6"
|
||||
|
||||
|
||||
@ -15,7 +15,7 @@ def run_closure_compiler(target, source, env, for_signature):
|
||||
return " ".join(cmd)
|
||||
|
||||
|
||||
def get_build_version(env):
|
||||
def get_build_version():
|
||||
import version
|
||||
|
||||
name = "custom_build"
|
||||
@ -30,6 +30,65 @@ def create_engine_file(env, target, source, externs):
|
||||
return env.Textfile(target, [env.File(s) for s in source])
|
||||
|
||||
|
||||
def create_template_zip(env, js, wasm, extra):
|
||||
binary_name = "godot.tools" if env["tools"] else "godot"
|
||||
zip_dir = env.Dir("#bin/.javascript_zip")
|
||||
in_files = [
|
||||
js,
|
||||
wasm,
|
||||
"#platform/javascript/js/libs/audio.worklet.js",
|
||||
]
|
||||
out_files = [
|
||||
zip_dir.File(binary_name + ".js"),
|
||||
zip_dir.File(binary_name + ".wasm"),
|
||||
zip_dir.File(binary_name + ".audio.worklet.js"),
|
||||
]
|
||||
# GDNative/Threads specific
|
||||
if env["gdnative_enabled"]:
|
||||
in_files.append(extra) # Runtime
|
||||
out_files.append(zip_dir.File(binary_name + ".side.wasm"))
|
||||
elif env["threads_enabled"]:
|
||||
in_files.append(extra) # Worker
|
||||
out_files.append(zip_dir.File(binary_name + ".worker.js"))
|
||||
|
||||
service_worker = "#misc/dist/html/service-worker.js"
|
||||
if env["tools"]:
|
||||
# HTML
|
||||
html = "#misc/dist/html/editor.html"
|
||||
subst_dict = {"@GODOT_VERSION@": get_build_version(), "@GODOT_NAME@": "GodotEngine"}
|
||||
html = env.Substfile(target="#bin/godot${PROGSUFFIX}.html", source=html, SUBST_DICT=subst_dict)
|
||||
in_files.append(html)
|
||||
out_files.append(zip_dir.File(binary_name + ".html"))
|
||||
# And logo/favicon
|
||||
in_files.append("#misc/dist/html/logo.svg")
|
||||
out_files.append(zip_dir.File("logo.svg"))
|
||||
in_files.append("#icon.png")
|
||||
out_files.append(zip_dir.File("favicon.png"))
|
||||
# PWA
|
||||
service_worker = env.Substfile(
|
||||
target="#bin/godot${PROGSUFFIX}.service.worker.js", source=service_worker, SUBST_DICT=subst_dict
|
||||
)
|
||||
in_files.append(service_worker)
|
||||
out_files.append(zip_dir.File("service.worker.js"))
|
||||
in_files.append("#misc/dist/html/manifest.json")
|
||||
out_files.append(zip_dir.File("manifest.json"))
|
||||
in_files.append("#misc/dist/html/offline.html")
|
||||
out_files.append(zip_dir.File("offline.html"))
|
||||
else:
|
||||
# HTML
|
||||
in_files.append("#misc/dist/html/full-size.html")
|
||||
out_files.append(zip_dir.File(binary_name + ".html"))
|
||||
|
||||
zip_files = env.InstallAs(out_files, in_files)
|
||||
env.Zip(
|
||||
"#bin/godot",
|
||||
zip_files,
|
||||
ZIPROOT=zip_dir,
|
||||
ZIPSUFFIX="${PROGSUFFIX}${ZIPSUFFIX}",
|
||||
ZIPCOMSTR="Archiving $SOURCES as $TARGET",
|
||||
)
|
||||
|
||||
|
||||
def add_js_libraries(env, libraries):
|
||||
env.Append(JS_LIBS=env.File(libraries))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user