Compare commits

...

8 Commits

Author SHA1 Message Date
Lea Anthony
ce4fa06828 Initial support for a serve port flag 2020-05-19 07:26:16 -05:00
Lea Anthony
6da02e6b44 v1.6.0-pre2 2020-05-17 20:17:36 +10:00
Lea Anthony
7cd78df1cd Support ArchLabs 2020-05-17 20:17:00 +10:00
Lea Anthony
bcecd854bc v1.6.0-pre1 2020-05-16 07:21:26 +10:00
Lea Anthony
6339f230f9 Fix CWE-126 2020-05-15 22:18:50 +01:00
Lea Anthony
131fd973cd lint fix 2020-05-15 22:18:50 +01:00
Lea Anthony
f1d16a03ec Disable F5 key on windows 2020-05-15 22:18:50 +01:00
Lea Anthony
cc99dcce80 Update contributors 2020-05-07 06:30:53 +10:00
14 changed files with 109 additions and 65 deletions

View File

@@ -25,4 +25,5 @@ Wails is what it is because of the time and effort given by these great people.
* [Travis McLane](https://github.com/tmclane) * [Travis McLane](https://github.com/tmclane)
* [Reuben Thomas-Davis](https://github.com/Rested) * [Reuben Thomas-Davis](https://github.com/Rested)
* [Jarek](https://github.com/Jarek-SRT) * [Jarek](https://github.com/Jarek-SRT)
* [Konez2k](https://github.com/konez2k) * [Konez2k](https://github.com/konez2k)
* [msms](https://github.com/sayuthisobri)

View File

@@ -57,7 +57,7 @@ _Ubuntu: 16.04, 18.04, 19.04_
_Also succesfully tested on: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neon_ _Also succesfully tested on: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neon_
#### Arch Linux #### Arch Linux / ArchLabs
`sudo pacman -S webkit2gtk gtk3` `sudo pacman -S webkit2gtk gtk3`

File diff suppressed because one or more lines are too long

View File

@@ -510,6 +510,8 @@ func InstallRuntime(caller string, projectDir string, projectOptions *ProjectOpt
// InstallBridge installs the relevant bridge javascript library // InstallBridge installs the relevant bridge javascript library
func InstallBridge(projectDir string, projectOptions *ProjectOptions) error { func InstallBridge(projectDir string, projectOptions *ProjectOptions) error {
bridgeFileData := mewn.String("../runtime/assets/bridge.js") bridgeFileData := mewn.String("../runtime/assets/bridge.js")
// Inject the custom serve port
bridgeFileData = strings.ReplaceAll(bridgeFileData, "$SERVEPORT$", projectOptions.ServePort)
bridgeFileTarget := filepath.Join(projectDir, projectOptions.FrontEnd.Dir, "node_modules", "@wailsapp", "runtime", "init.js") bridgeFileTarget := filepath.Join(projectDir, projectOptions.FrontEnd.Dir, "node_modules", "@wailsapp", "runtime", "init.js")
err := fs.CreateFile(bridgeFileTarget, []byte(bridgeFileData)) err := fs.CreateFile(bridgeFileTarget, []byte(bridgeFileData))
return err return err
@@ -561,6 +563,10 @@ func ldFlags(po *ProjectOptions, buildMode string) string {
ldflags += "-X github.com/wailsapp/wails.BuildMode=" + buildMode ldflags += "-X github.com/wailsapp/wails.BuildMode=" + buildMode
// Inject port if we are using bridge mode
if buildMode == BuildModeBridge {
ldflags += " -X github.com/wailsapp/wails/lib/renderer/bridge.ServePort=" + po.ServePort
}
// If we wish to generate typescript // If we wish to generate typescript
if po.typescriptDefsFilename != "" { if po.typescriptDefsFilename != "" {
cwd, err := os.Getwd() cwd, err := os.Getwd()

View File

@@ -53,10 +53,12 @@ const (
Deepin Deepin
// Raspbian distribution // Raspbian distribution
Raspbian Raspbian
// openSUSE Tumbleweed distribution // Tumbleweed (OpenSUSE) distribution
Tumbleweed Tumbleweed
// openSUSE Leap distribution // Leap (OpenSUSE) distribution
Leap Leap
// ArchLabs distribution
ArchLabs
) )
// DistroInfo contains all the information relating to a linux distribution // DistroInfo contains all the information relating to a linux distribution
@@ -114,13 +116,15 @@ func parseOsRelease(osRelease string) *DistroInfo {
} }
// Check distro name against list of distros // Check distro name against list of distros
switch osID { switch strings.ToLower(osID) {
case "fedora": case "fedora":
result.Distribution = Fedora result.Distribution = Fedora
case "centos": case "centos":
result.Distribution = CentOS result.Distribution = CentOS
case "arch": case "arch":
result.Distribution = Arch result.Distribution = Arch
case "archlabs":
result.Distribution = ArchLabs
case "debian": case "debian":
result.Distribution = Debian result.Distribution = Debian
case "ubuntu": case "ubuntu":

View File

@@ -176,6 +176,15 @@ distributions:
gccversioncommand: *gccdumpversion gccversioncommand: *gccdumpversion
programs: *archdefaultprograms programs: *archdefaultprograms
libraries: *archdefaultlibraries libraries: *archdefaultlibraries
archlabs:
id: archlabs
releases:
default:
version: default
name: ArchLabs
gccversioncommand: *gccdumpversion
programs: *archdefaultprograms
libraries: *archdefaultlibraries
manjaro: manjaro:
id: manjaro id: manjaro
releases: releases:

View File

@@ -161,6 +161,7 @@ type ProjectOptions struct {
CrossCompile bool CrossCompile bool
Platform string Platform string
Architecture string Architecture string
ServePort string
} }
// Defaults sets the default project template // Defaults sets the default project template

View File

@@ -276,7 +276,7 @@ func CheckDependencies(logger *Logger) (bool, error) {
switch distroInfo.Distribution { switch distroInfo.Distribution {
case Ubuntu, Debian, Zorin, Parrot, Linuxmint, Elementary, Kali, Neon, Deepin, Raspbian: case Ubuntu, Debian, Zorin, Parrot, Linuxmint, Elementary, Kali, Neon, Deepin, Raspbian:
libraryChecker = DpkgInstalled libraryChecker = DpkgInstalled
case Arch, ArcoLinux, Manjaro, ManjaroARM: case Arch, ArcoLinux, ArchLabs, Manjaro, ManjaroARM:
libraryChecker = PacmanInstalled libraryChecker = PacmanInstalled
case CentOS, Fedora, Tumbleweed, Leap: case CentOS, Fedora, Tumbleweed, Leap:
libraryChecker = RpmInstalled libraryChecker = RpmInstalled

View File

@@ -1,4 +1,4 @@
package cmd package cmd
// Version - Wails version // Version - Wails version
const Version = "v1.5.0" const Version = "v1.6.0-pre2"

View File

@@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"strconv"
"github.com/leaanthony/spinner" "github.com/leaanthony/spinner"
"github.com/wailsapp/wails/cmd" "github.com/wailsapp/wails/cmd"
@@ -10,6 +11,7 @@ import (
func init() { func init() {
var forceRebuild = false var forceRebuild = false
var servePort = "34115"
var verbose = false var verbose = false
buildSpinner := spinner.NewSpinner() buildSpinner := spinner.NewSpinner()
buildSpinner.SetSpinSpeed(50) buildSpinner.SetSpinSpeed(50)
@@ -18,7 +20,8 @@ func init() {
initCmd := app.Command("serve", "Run your Wails project in bridge mode"). initCmd := app.Command("serve", "Run your Wails project in bridge mode").
LongDescription(commandDescription). LongDescription(commandDescription).
BoolFlag("verbose", "Verbose output", &verbose). BoolFlag("verbose", "Verbose output", &verbose).
BoolFlag("f", "Force rebuild of application components", &forceRebuild) BoolFlag("f", "Force rebuild of application components", &forceRebuild).
StringFlag("p", "Port to serve on", &servePort)
initCmd.Action(func() error { initCmd.Action(func() error {
@@ -34,7 +37,6 @@ func init() {
// Project options // Project options
projectOptions := &cmd.ProjectOptions{} projectOptions := &cmd.ProjectOptions{}
projectOptions.Verbose = verbose
// Check we are in project directory // Check we are in project directory
// Check project.json loads correctly // Check project.json loads correctly
@@ -44,6 +46,16 @@ func init() {
return err return err
} }
// Set Verbose flag
projectOptions.Verbose = verbose
// Check port
port, err := strconv.Atoi(servePort)
if err != nil || port <= 0 {
return fmt.Errorf("invalid port value: %s", servePort)
}
projectOptions.ServePort = servePort
// Save project directory // Save project directory
projectDir := fs.Cwd() projectDir := fs.Cwd()

View File

@@ -1,4 +1,4 @@
package renderer package bridge
import ( import (
"encoding/json" "encoding/json"
@@ -14,6 +14,10 @@ import (
type messageType int type messageType int
// ServePort indicates which port to serve the backend on when using
// `wails serve`
var ServePort = "34115"
const ( const (
jsMessage messageType = iota jsMessage messageType = iota
cssMessage cssMessage
@@ -93,7 +97,7 @@ func (h *Bridge) startSession(conn *websocket.Conn) {
// Run the app in Bridge mode! // Run the app in Bridge mode!
func (h *Bridge) Run() error { func (h *Bridge) Run() error {
h.server = &http.Server{Addr: ":34115"} h.server = &http.Server{Addr: ":" + ServePort}
http.HandleFunc("/bridge", h.wsBridgeHandler) http.HandleFunc("/bridge", h.wsBridgeHandler)
h.log.Info("Bridge mode started.") h.log.Info("Bridge mode started.")

View File

@@ -1,4 +1,4 @@
package renderer package bridge
import ( import (
"time" "time"

View File

@@ -139,7 +139,7 @@ struct webview_priv
#define DEFAULT_URL \ #define DEFAULT_URL \
"data:text/" \ "data:text/" \
"html,%3C%21DOCTYPE%20html%3E%0A%3Chtml%20lang=%22en%22%3E%0A%3Chead%3E%" \ "html,%3C%21DOCTYPE%20html%3E%0A%3Chtml%20lang=%22en%22%3E%0A%3Chead%3E%" \
"3Cmeta%20charset=%22utf-8%22%3E%3Cmeta%20http-equiv=%22IE=edge%22%" \ "3Cmeta%20charset=%22utf-8%22%3E%3Cmeta%20http-equiv=%22IE=edge%22%" \
"20content=%22IE=edge%22%3E%3C%2Fhead%3E%0A%3Cbody%3E%3Cdiv%20id=%22app%22%" \ "20content=%22IE=edge%22%3E%3C%2Fhead%3E%0A%3Cbody%3E%3Cdiv%20id=%22app%22%" \
"3E%3C%2Fdiv%3E%3Cscript%20type=%22text%2Fjavascript%22%3E%3C%2Fscript%3E%" \ "3E%3C%2Fdiv%3E%3Cscript%20type=%22text%2Fjavascript%22%3E%3C%2Fscript%3E%" \
"3C%2Fbody%3E%0A%3C%2Fhtml%3E" "3C%2Fbody%3E%0A%3C%2Fhtml%3E"
@@ -1227,7 +1227,7 @@ struct webview_priv
} }
VariantInit(&myURL); VariantInit(&myURL);
myURL.vt = VT_BSTR; myURL.vt = VT_BSTR;
// #ifndef UNICODE // #ifndef UNICODE
{ {
wchar_t *buffer = webview_to_utf16(webPageName); wchar_t *buffer = webview_to_utf16(webPageName);
if (buffer == NULL) if (buffer == NULL)
@@ -1237,9 +1237,9 @@ struct webview_priv
myURL.bstrVal = SysAllocString(buffer); myURL.bstrVal = SysAllocString(buffer);
GlobalFree(buffer); GlobalFree(buffer);
} }
// #else // #else
// myURL.bstrVal = SysAllocString(webPageName); // myURL.bstrVal = SysAllocString(webPageName);
// #endif // #endif
if (!myURL.bstrVal) if (!myURL.bstrVal)
{ {
badalloc: badalloc:
@@ -1277,7 +1277,7 @@ struct webview_priv
if (!SafeArrayAccessData(sfArray, (void **)&pVar)) if (!SafeArrayAccessData(sfArray, (void **)&pVar))
{ {
pVar->vt = VT_BSTR; pVar->vt = VT_BSTR;
// #ifndef UNICODE // #ifndef UNICODE
{ {
wchar_t *buffer = webview_to_utf16(url); wchar_t *buffer = webview_to_utf16(url);
if (buffer == NULL) if (buffer == NULL)
@@ -1287,9 +1287,9 @@ struct webview_priv
bstr = SysAllocString(buffer); bstr = SysAllocString(buffer);
GlobalFree(buffer); GlobalFree(buffer);
} }
// #else // #else
// bstr = SysAllocString(url); // bstr = SysAllocString(url);
// #endif // #endif
if ((pVar->bstrVal = bstr)) if ((pVar->bstrVal = bstr))
{ {
htmlDoc2->lpVtbl->write(htmlDoc2, sfArray); htmlDoc2->lpVtbl->write(htmlDoc2, sfArray);
@@ -1444,12 +1444,12 @@ struct webview_priv
rect.right - rect.left, rect.bottom - rect.top, rect.right - rect.left, rect.bottom - rect.top,
HWND_DESKTOP, NULL, hInstance, (void *)w); HWND_DESKTOP, NULL, hInstance, (void *)w);
#else #else
w->priv.hwnd = w->priv.hwnd =
CreateWindowEx(0, classname, w->title, style, rect.left, rect.top, CreateWindowEx(0, classname, w->title, style, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top, rect.right - rect.left, rect.bottom - rect.top,
HWND_DESKTOP, NULL, hInstance, (void *)w); HWND_DESKTOP, NULL, hInstance, (void *)w);
#endif #endif
if (w->priv.hwnd == 0) if (w->priv.hwnd == 0)
{ {
OleUninitialize(); OleUninitialize();
@@ -1466,8 +1466,7 @@ struct webview_priv
#else #else
SetWindowText(w->priv.hwnd, w->title); SetWindowText(w->priv.hwnd, w->title);
#endif #endif
ShowWindow(w->priv.hwnd, SW_SHOWDEFAULT); ShowWindow(w->priv.hwnd, SW_SHOWDEFAULT);
UpdateWindow(w->priv.hwnd); UpdateWindow(w->priv.hwnd);
SetFocus(w->priv.hwnd); SetFocus(w->priv.hwnd);
@@ -1494,6 +1493,11 @@ struct webview_priv
case WM_KEYDOWN: case WM_KEYDOWN:
case WM_KEYUP: case WM_KEYUP:
{ {
// Disable refresh when pressing F5 on windows
if (msg.wParam == VK_F5)
{
break;
}
HRESULT r = S_OK; HRESULT r = S_OK;
IWebBrowser2 *webBrowser2; IWebBrowser2 *webBrowser2;
IOleObject *browser = *w->priv.browser; IOleObject *browser = *w->priv.browser;
@@ -1603,7 +1607,7 @@ struct webview_priv
WEBVIEW_API void webview_set_title(struct webview *w, const char *title) WEBVIEW_API void webview_set_title(struct webview *w, const char *title)
{ {
#ifdef UNICODE #ifdef UNICODE
wchar_t *u16title = webview_to_utf16(title); wchar_t *u16title = webview_to_utf16(title);
if (u16title == NULL) if (u16title == NULL)
{ {
@@ -1611,12 +1615,11 @@ struct webview_priv
} }
SetWindowText(w->priv.hwnd, u16title); SetWindowText(w->priv.hwnd, u16title);
GlobalFree(u16title); GlobalFree(u16title);
#else #else
SetWindowText(w->priv.hwnd, title); SetWindowText(w->priv.hwnd, title);
#endif #endif
} }
WEBVIEW_API void webview_set_fullscreen(struct webview *w, int fullscreen) WEBVIEW_API void webview_set_fullscreen(struct webview *w, int fullscreen)
{ {
if (w->priv.is_fullscreen == !!fullscreen) if (w->priv.is_fullscreen == !!fullscreen)
@@ -1927,22 +1930,26 @@ struct webview_priv
[script setValue:self forKey:@"external"]; [script setValue:self forKey:@"external"];
} }
static void webview_run_input_open_panel(id self, SEL cmd, id webview, static void webview_run_input_open_panel(id self, SEL cmd, id webview,
id listener, BOOL allowMultiple) { id listener, BOOL allowMultiple)
{
char filename[256] = ""; char filename[256] = "";
struct webview *w = struct webview *w =
(struct webview *)objc_getAssociatedObject(self, "webview"); (struct webview *)objc_getAssociatedObject(self, "webview");
webview_dialog(w, WEBVIEW_DIALOG_TYPE_OPEN, WEBVIEW_DIALOG_FLAG_FILE, "", "", webview_dialog(w, WEBVIEW_DIALOG_TYPE_OPEN, WEBVIEW_DIALOG_FLAG_FILE, "", "",
filename, 255); filename, 255);
if (strlen(filename)) { filename[255] = '\0';
if (strlen(filename) > 0)
{
[listener chooseFilename:[NSString stringWithUTF8String:filename]]; [listener chooseFilename:[NSString stringWithUTF8String:filename]];
} else { }
else
{
[listener cancel]; [listener cancel];
} }
} }
static void webview_external_invoke(id self, SEL cmd, id arg) static void webview_external_invoke(id self, SEL cmd, id arg)
{ {
struct webview *w = struct webview *w =
@@ -1955,7 +1962,7 @@ static void webview_run_input_open_panel(id self, SEL cmd, id webview,
{ {
return; return;
} }
w->external_invoke_cb(w, [(NSString *)(arg)UTF8String]); w->external_invoke_cb(w, [(NSString *)(arg) UTF8String]);
} }
WEBVIEW_API int webview_init(struct webview *w) WEBVIEW_API int webview_init(struct webview *w)

View File

@@ -14,7 +14,7 @@ function init() {
window.wailsbridge = { window.wailsbridge = {
reconnectOverlay: null, reconnectOverlay: null,
reconnectTimer: 300, reconnectTimer: 300,
wsURL: 'ws://' + window.location.hostname + ':34115/bridge', wsURL: 'ws://' + window.location.hostname + ':$SERVEPORT$/bridge',
connectionState: null, connectionState: null,
config: {}, config: {},
websocket: null, websocket: null,
@@ -149,38 +149,38 @@ function startBridge() {
function handleMessage(message) { function handleMessage(message) {
// As a bridge we ignore js and css injections // As a bridge we ignore js and css injections
switch (message.data[0]) { switch (message.data[0]) {
// Wails library - inject! // Wails library - inject!
case 'w': case 'w':
addScript(message.data.slice(1)); addScript(message.data.slice(1));
// Now wails runtime is loaded, wails for the ready event // Now wails runtime is loaded, wails for the ready event
// and callback to the main app // and callback to the main app
window.wails.Events.On('wails:loaded', function () { window.wails.Events.On('wails:loaded', function () {
window.wailsbridge.log('Wails Ready'); window.wailsbridge.log('Wails Ready');
if (window.wailsbridge.callback) { if (window.wailsbridge.callback) {
window.wailsbridge.log('Notifying application'); window.wailsbridge.log('Notifying application');
window.wailsbridge.callback(window.wails); window.wailsbridge.callback(window.wails);
} }
}); });
window.wailsbridge.log('Loaded Wails Runtime'); window.wailsbridge.log('Loaded Wails Runtime');
break; break;
// Notifications // Notifications
case 'n': case 'n':
addScript(message.data.slice(1), true); addScript(message.data.slice(1), true);
break; break;
// Binding // Binding
case 'b': case 'b':
var binding = message.data.slice(1); var binding = message.data.slice(1);
//log("Binding: " + binding) //log("Binding: " + binding)
window.wails._.NewBinding(binding); window.wails._.NewBinding(binding);
break; break;
// Call back // Call back
case 'c': case 'c':
var callbackData = message.data.slice(1); var callbackData = message.data.slice(1);
window.wails._.Callback(callbackData); window.wails._.Callback(callbackData);
break; break;
default: default:
window.wails.Log.Error('Unknown message type received: ' + message.data[0]); window.wails.Log.Error('Unknown message type received: ' + message.data[0]);
} }
} }