Compare commits

..

6 Commits

Author SHA1 Message Date
Lea Anthony 7d1acfaabd Fix crowdin client code 2022-12-29 12:23:34 +11:00
Lea Anthony 4db4149cde Merge remote-tracking branch 'origin/release/v2.3.0' into release/v2.3.0 2022-12-29 11:56:50 +11:00
Lea Anthony 26dd9f59ba Update changelog 2022-12-29 11:54:55 +11:00
Lea Anthony 9e7f793b31 v2.3.0 docs 2022-12-29 11:54:55 +11:00
Lea Anthony af03b83b54 Update changelog 2022-12-29 11:52:37 +11:00
Lea Anthony 6192ef2594 v2.3.0 docs 2022-12-29 11:40:55 +11:00
717 changed files with 1547 additions and 53765 deletions
-3
View File
@@ -31,6 +31,3 @@ v2/test/kitchensink/frontend/package.json.md5
v2/cmd/wails/internal/commands/initialise/templates/testtemplates/
.env
/website/static/img/.cache.json
/v3/.task
/v3/examples/build/bin/testapp
+2 -2
View File
@@ -30,8 +30,8 @@
<img alt="Slack" src="https://img.shields.io/badge/slack-gophers%2Fwails%20-blue?logo=slack"/>
</a>
<br/>
<a href="https://github.com/wailsapp/wails/actions/workflows/build-and-test.yml" rel="nofollow">
<img src="https://img.shields.io/github/actions/workflow/status/wailsapp/wails/build-and-test.yml?branch=master&logo=Github" alt="Build" />
<a href="https://github.com/wailsapp/wails/actions/workflows/build.yml" rel="nofollow">
<img src="https://img.shields.io/github/workflow/status/wailsapp/wails/Build?logo=github" alt="Build" />
</a>
<a href="https://github.com/wailsapp/wails/tags" rel="nofollow">
<img alt="GitHub tag (latest SemVer pre-release)" src="https://img.shields.io/github/v/tag/wailsapp/wails?include_prereleases&label=version"/>
+2 -2
View File
@@ -30,8 +30,8 @@
<img alt="Slack" src="https://img.shields.io/badge/slack-gophers%2Fwails%20-blue?logo=slack"/>
</a>
<br/>
<a href="https://github.com/wailsapp/wails/actions/workflows/build-and-test.yml" rel="nofollow">
<img src="https://img.shields.io/github/actions/workflow/status/wailsapp/wails/build-and-test.yml?branch=master&logo=Github" alt="Build" />
<a href="https://github.com/wailsapp/wails/actions/workflows/build.yml" rel="nofollow">
<img src="https://img.shields.io/github/workflow/status/wailsapp/wails/Build?logo=github" alt="Build" />
</a>
<a href="https://github.com/wailsapp/wails/tags" rel="nofollow">
<img alt="GitHub tag (latest SemVer pre-release)" src="https://img.shields.io/github/v/tag/wailsapp/wails?include_prereleases&label=version"/>
+2 -2
View File
@@ -28,8 +28,8 @@
<img alt="Slack" src="https://img.shields.io/badge/slack-gophers%2Fwails%20-blue?logo=slack"/>
</a>
<br/>
<a href="https://github.com/wailsapp/wails/actions/workflows/build-and-test.yml" rel="nofollow">
<img src="https://img.shields.io/github/actions/workflow/status/wailsapp/wails/build-and-test.yml?branch=master&logo=Github" alt="Build" />
<a href="https://github.com/wailsapp/wails/actions/workflows/build.yml" rel="nofollow">
<img src="https://img.shields.io/github/workflow/status/wailsapp/wails/Build?logo=github" alt="Build" />
</a>
<a href="https://github.com/wailsapp/wails/tags" rel="nofollow">
<img alt="GitHub tag (latest SemVer pre-release)" src="https://img.shields.io/github/v/tag/wailsapp/wails?include_prereleases&label=version"/>
+2 -2
View File
@@ -30,8 +30,8 @@
<img alt="Slack" src="https://img.shields.io/badge/slack-gophers%2Fwails%20-blue?logo=slack"/>
</a>
<br/>
<a href="https://github.com/wailsapp/wails/actions/workflows/build-and-test.yml" rel="nofollow">
<img src="https://img.shields.io/github/actions/workflow/status/wailsapp/wails/build-and-test.yml?branch=master&logo=Github" alt="Build" />
<a href="https://github.com/wailsapp/wails/actions/workflows/build.yml" rel="nofollow">
<img src="https://img.shields.io/github/workflow/status/wailsapp/wails/Build?logo=github" alt="Build" />
</a>
<a href="https://github.com/wailsapp/wails/tags" rel="nofollow">
<img alt="GitHub tag (latest SemVer pre-release)" src="https://img.shields.io/github/v/tag/wailsapp/wails?include_prereleases&label=version"/>
+1 -1
View File
@@ -141,7 +141,7 @@ func (a *App) start() error {
// Defer the shutdown
defer a.shutdown()
// run the renderer
// Run the renderer
err = a.renderer.Run()
if err != nil {
return err
+1 -1
View File
@@ -55,7 +55,7 @@ func newIPCMessage(incomingMessage string, responseFunction func(*ipcResponse) e
// hasCallbackID checks if the message can send an error back to the frontend
func (m *ipcMessage) hasCallbackID() error {
if m.CallbackID == "" {
return fmt.Errorf("attempted to return error to message with no callback ID")
return fmt.Errorf("attempted to return error to message with no Callback ID")
}
return nil
}
+2 -2
View File
@@ -186,7 +186,7 @@ func (w *WebView) evalJSSync(js string) error {
go func() {
exit := false
// We are done when we receive the callback ID
// We are done when we receive the Callback ID
w.log.Debug("SyncJS: sending with ID = " + ID)
w.eventManager.On(ID, func(...interface{}) {
w.log.Debug("SyncJS: Got callback ID = " + ID)
@@ -361,7 +361,7 @@ func (w *WebView) focus() {
// callback sends a callback to the frontend
func (w *WebView) callback(data string) error {
callbackCMD := fmt.Sprintf("window.wails._.callback('%s');", data)
callbackCMD := fmt.Sprintf("window.wails._.Callback('%s');", data)
return w.evalJS(callbackCMD)
}
+8 -8
View File
@@ -2,15 +2,14 @@ package flags
import (
"fmt"
"os"
"os/exec"
"runtime"
"strings"
"github.com/leaanthony/slicer"
"github.com/wailsapp/wails/v2/internal/system"
"github.com/wailsapp/wails/v2/pkg/commands/build"
"github.com/wailsapp/wails/v2/pkg/commands/buildtags"
"os"
"os/exec"
"runtime"
"strings"
)
const (
@@ -52,6 +51,7 @@ type Build struct {
}
func (b *Build) Default() *Build {
defaultPlatform := os.Getenv("GOOS")
if defaultPlatform == "" {
defaultPlatform = runtime.GOOS
@@ -64,13 +64,13 @@ func (b *Build) Default() *Build {
defaultArch = runtime.GOARCH
}
}
b.defaultArch = defaultArch
platform := defaultPlatform + "/" + defaultArch
result := &Build{
Platform: defaultPlatform + "/" + defaultArch,
Platform: platform,
WebView2: "download",
GarbleArgs: "-literals -tiny -seed=random",
defaultArch: defaultArch,
}
result.BuildCommon = result.BuildCommon.Default()
return result
+1 -1
View File
@@ -1 +1 @@
v2.3.1
v2.3.0
+2 -3
View File
@@ -4,13 +4,12 @@ import (
"context"
"embed"
"fmt"
"time"
"github.com/wailsapp/wails/v2/pkg/application"
"github.com/wailsapp/wails/v2/pkg/menu"
"github.com/wailsapp/wails/v2/pkg/options"
"github.com/wailsapp/wails/v2/pkg/options/windows"
"github.com/wailsapp/wails/v2/pkg/runtime"
"time"
)
//go:embed all:frontend/dist
@@ -53,7 +52,7 @@ func main() {
// create windows programmatically and be able to show/hide
// them from the systray with something like:
//
// myWindow := mainApp.NewWebviewWindow(...)
// myWindow := mainApp.NewWindow(...)
// mainApp.NewSystemTray(&options.SystemTray{
// OnLeftClick: func() {
// myWindow.SetVisibility(!myWindow.IsVisible())
+1 -2
View File
@@ -12,9 +12,8 @@ import (
"os"
"path/filepath"
"github.com/wailsapp/wails/v2/pkg/assetserver"
"github.com/wailsapp/wails/v2/internal/binding"
"github.com/wailsapp/wails/v2/internal/frontend/assetserver"
"github.com/wailsapp/wails/v2/internal/frontend/desktop"
"github.com/wailsapp/wails/v2/internal/frontend/devserver"
"github.com/wailsapp/wails/v2/internal/frontend/dispatcher"
@@ -2,6 +2,7 @@ package assetserver
import (
"bytes"
"context"
"embed"
"errors"
"fmt"
@@ -12,14 +13,11 @@ import (
"path"
"strings"
"github.com/wailsapp/wails/v2/internal/fs"
"github.com/wailsapp/wails/v2/internal/logger"
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
)
type Logger interface {
Debug(message string, args ...interface{})
Error(message string, args ...interface{})
}
//go:embed defaultindex.html
var defaultHTML []byte
@@ -31,12 +29,16 @@ type assetHandler struct {
fs iofs.FS
handler http.Handler
logger Logger
logger *logger.Logger
retryMissingFiles bool
}
func NewAssetHandler(options assetserver.Options, log Logger) (http.Handler, error) {
func NewAssetHandler(ctx context.Context, options assetserver.Options) (http.Handler, error) {
var log *logger.Logger
if _logger := ctx.Value("logger"); _logger != nil {
log = _logger.(*logger.Logger)
}
vfs := options.Assets
if vfs != nil {
@@ -44,12 +46,12 @@ func NewAssetHandler(options assetserver.Options, log Logger) (http.Handler, err
return nil, err
}
subDir, err := FindPathToFile(vfs, indexHTML)
subDir, err := fs.FindPathToFile(vfs, indexHTML)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
msg := "no `index.html` could be found in your Assets fs.FS"
if embedFs, isEmbedFs := vfs.(embed.FS); isEmbedFs {
rootFolder, _ := FindEmbedRootPath(embedFs)
rootFolder, _ := fs.FindEmbedRootPath(embedFs)
msg += fmt.Sprintf(", please make sure the embedded directory '%s' is correct and contains your assets", rootFolder)
}
@@ -154,19 +156,16 @@ func (d *assetHandler) serveFSFile(rw http.ResponseWriter, req *http.Request, fi
}
var buf [512]byte
var n int
if _, haveType := rw.Header()[HeaderContentType]; !haveType {
// Detect MimeType by sniffing the first 512 bytes
n, err = file.Read(buf[:])
if err != nil && err != io.EOF {
return err
}
n, err := file.Read(buf[:])
if err != nil && err != io.EOF {
return err
}
// Do the custom MimeType sniffing even though http.ServeContent would do it in case
// of an io.ReadSeeker. We would like to have a consistent behaviour in both cases.
if contentType := GetMimetype(filename, buf[:n]); contentType != "" {
rw.Header().Set(HeaderContentType, contentType)
}
// Detect MimeType by sniffing the first 512 bytes
// Do the custom MimeType sniffing even though http.ServeContent would do it in case
// of an io.ReadSeeker. We would like to have a consistent behaviour in both cases.
if contentType := GetMimetype(filename, buf[:n]); contentType != "" {
rw.Header().Set(HeaderContentType, contentType)
}
if fileSeeker, _ := file.(io.ReadSeeker); fileSeeker != nil {
@@ -2,11 +2,16 @@ package assetserver
import (
"bytes"
"context"
"fmt"
"net/http"
"net/http/httptest"
"strconv"
"golang.org/x/net/html"
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
"github.com/wailsapp/wails/v2/internal/logger"
"github.com/wailsapp/wails/v2/pkg/options"
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
)
@@ -16,50 +21,41 @@ const (
ipcJSPath = "/wails/ipc.js"
)
type RuntimeAssets interface {
DesktopIPC() []byte
WebsocketIPC() []byte
RuntimeDesktopJS() []byte
}
type AssetServer struct {
handler http.Handler
wsHandler http.Handler
runtimeJS []byte
ipcJS func(*http.Request) []byte
logger Logger
runtime RuntimeAssets
logger *logger.Logger
servingFromDisk bool
appendSpinnerToBody bool
assetServerWebView
}
func NewAssetServerMainPage(bindingsJSON string, options *options.App, servingFromDisk bool, logger Logger, runtime RuntimeAssets) (*AssetServer, error) {
func NewAssetServerMainPage(ctx context.Context, bindingsJSON string, options *options.App) (*AssetServer, error) {
assetOptions, err := BuildAssetServerConfig(options)
if err != nil {
return nil, err
}
return NewAssetServer(bindingsJSON, assetOptions, servingFromDisk, logger, runtime)
return NewAssetServer(ctx, bindingsJSON, assetOptions)
}
func NewAssetServer(bindingsJSON string, options assetserver.Options, servingFromDisk bool, logger Logger, runtime RuntimeAssets) (*AssetServer, error) {
handler, err := NewAssetHandler(options, logger)
func NewAssetServer(ctx context.Context, bindingsJSON string, options assetserver.Options) (*AssetServer, error) {
handler, err := NewAssetHandler(ctx, options)
if err != nil {
return nil, err
}
return NewAssetServerWithHandler(handler, bindingsJSON, servingFromDisk, logger, runtime)
return NewAssetServerWithHandler(ctx, handler, bindingsJSON)
}
func NewAssetServerWithHandler(handler http.Handler, bindingsJSON string, servingFromDisk bool, logger Logger, runtime RuntimeAssets) (*AssetServer, error) {
func NewAssetServerWithHandler(ctx context.Context, handler http.Handler, bindingsJSON string) (*AssetServer, error) {
var buffer bytes.Buffer
if bindingsJSON != "" {
buffer.WriteString(`window.wailsbindings='` + bindingsJSON + `';` + "\n")
}
buffer.Write(runtime.RuntimeDesktopJS())
buffer.Write(runtime.RuntimeDesktopJS)
result := &AssetServer{
handler: handler,
@@ -69,9 +65,11 @@ func NewAssetServerWithHandler(handler http.Handler, bindingsJSON string, servin
// If so, this means we are in dev mode and are serving assets off disk.
// We indicate this through the `servingFromDisk` flag to ensure requests
// aren't cached in dev mode.
servingFromDisk: servingFromDisk,
logger: logger,
runtime: runtime,
servingFromDisk: ctx.Value("assetdir") != nil,
}
if _logger := ctx.Value("logger"); _logger != nil {
result.logger = _logger.(*logger.Logger)
}
return result, nil
@@ -123,7 +121,7 @@ func (d *AssetServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
d.writeBlob(rw, path, d.runtimeJS)
case ipcJSPath:
content := d.runtime.DesktopIPC()
content := runtime.DesktopIPC
if d.ipcJS != nil {
content = d.ipcJS(req)
}
@@ -134,6 +132,47 @@ func (d *AssetServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
}
}
// ProcessHTTPRequest processes the HTTP Request by faking a golang HTTP Server.
// The request will be finished with a StatusNotImplemented code if no handler has written to the response.
func (d *AssetServer) ProcessHTTPRequest(logInfo string, rw http.ResponseWriter, reqGetter func() (*http.Request, error)) {
rw = &contentTypeSniffer{rw: rw} // Make sure we have a Content-Type sniffer
req, err := reqGetter()
if err != nil {
d.logError("Error processing request '%s': %s (HttpResponse=500)", logInfo, err)
http.Error(rw, err.Error(), http.StatusInternalServerError)
return
}
if req.Body == nil {
req.Body = http.NoBody
}
defer req.Body.Close()
if req.RemoteAddr == "" {
// 192.0.2.0/24 is "TEST-NET" in RFC 5737
req.RemoteAddr = "192.0.2.1:1234"
}
if req.RequestURI == "" && req.URL != nil {
req.RequestURI = req.URL.String()
}
if req.ContentLength == 0 {
req.ContentLength, _ = strconv.ParseInt(req.Header.Get(HeaderContentLength), 10, 64)
} else {
req.Header.Set(HeaderContentLength, fmt.Sprintf("%d", req.ContentLength))
}
if host := req.Header.Get(HeaderHost); host != "" {
req.Host = host
}
d.ServeHTTP(rw, req)
rw.WriteHeader(http.StatusNotImplemented) // This is a NOP when a handler has already written and set the status
}
func (d *AssetServer) processIndexHTML(indexHTML []byte) ([]byte, error) {
htmlNode, err := getHTMLNode(indexHTML)
if err != nil {
@@ -4,8 +4,11 @@
package assetserver
import (
"context"
"net/http"
"strings"
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
)
/*
@@ -13,8 +16,8 @@ The assetserver for the dev mode.
Depending on the UserAgent it injects a websocket based IPC script into `index.html` or the default desktop IPC. The
default desktop IPC is injected when the webview accesses the devserver.
*/
func NewDevAssetServer(handler http.Handler, wsHandler http.Handler, bindingsJSON string, servingFromDisk bool, logger Logger, runtime RuntimeAssets) (*AssetServer, error) {
result, err := NewAssetServerWithHandler(handler, bindingsJSON, servingFromDisk, logger, runtime)
func NewDevAssetServer(ctx context.Context, handler http.Handler, wsHandler http.Handler, bindingsJSON string) (*AssetServer, error) {
result, err := NewAssetServerWithHandler(ctx, handler, bindingsJSON)
if err != nil {
return nil, err
}
@@ -23,9 +26,9 @@ func NewDevAssetServer(handler http.Handler, wsHandler http.Handler, bindingsJSO
result.appendSpinnerToBody = true
result.ipcJS = func(req *http.Request) []byte {
if strings.Contains(req.UserAgent(), WailsUserAgentValue) {
return runtime.DesktopIPC()
return runtime.DesktopIPC
}
return runtime.WebsocketIPC()
return runtime.WebsocketIPC
}
return result, nil

Some files were not shown because too many files have changed in this diff Show More