mirror of
https://github.com/wavetermdev/wails.git
synced 2026-08-05 13:53:43 -07:00
feat: initial support for browser.openURL for f/e
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
package wails
|
||||
|
||||
import "strings"
|
||||
import "fmt"
|
||||
|
||||
type internalMethods struct{
|
||||
log *CustomLogger
|
||||
browser *RuntimeBrowser
|
||||
}
|
||||
|
||||
func newInternalMethods() *internalMethods {
|
||||
return &internalMethods{
|
||||
log: newCustomLogger("InternalCall"),
|
||||
browser: newRuntimeBrowser(),
|
||||
}
|
||||
}
|
||||
|
||||
func (i *internalMethods) processCall(callData *callData) (interface{}, error) {
|
||||
if !strings.HasPrefix(callData.BindingName, ".wails.") {
|
||||
return nil, fmt.Errorf("Invalid call signature '%s'", callData.BindingName)
|
||||
}
|
||||
|
||||
// Strip prefix
|
||||
var splitCall = strings.Split(callData.BindingName,".")[2:]
|
||||
if len(splitCall) != 2 {
|
||||
return nil, fmt.Errorf("Invalid call signature '%s'", callData.BindingName)
|
||||
}
|
||||
|
||||
group := splitCall[0]
|
||||
switch group {
|
||||
case "browser":
|
||||
return i.processBrowserCommand(splitCall[1], callData.Data)
|
||||
default:
|
||||
return nil, fmt.Errorf("Unknown internal command group '%s'", group)
|
||||
}
|
||||
}
|
||||
|
||||
func (i *internalMethods) processBrowserCommand(command string, data interface{}) (interface{}, error) {
|
||||
switch command {
|
||||
case "openURL":
|
||||
url := data.(string)
|
||||
// Strip string quotes. Credit: https://stackoverflow.com/a/44222648
|
||||
if url[0] == '"' {
|
||||
url = url[1:]
|
||||
}
|
||||
if i := len(url)-1; url[i] == '"' {
|
||||
url = url[:i]
|
||||
}
|
||||
i.log.Debugf("Calling browser.openURL with '%s'", url)
|
||||
return nil, i.browser.OpenURL(url)
|
||||
default:
|
||||
return nil, fmt.Errorf("Unknown browser command '%s'", command)
|
||||
}
|
||||
}
|
||||
+12
-3
@@ -17,6 +17,7 @@ binding:
|
||||
type bindingManager struct {
|
||||
methods map[string]*boundMethod
|
||||
functions map[string]*boundFunction
|
||||
internalMethods *internalMethods
|
||||
initMethods []*boundMethod
|
||||
log *CustomLogger
|
||||
renderer Renderer
|
||||
@@ -27,9 +28,10 @@ type bindingManager struct {
|
||||
|
||||
func newBindingManager() *bindingManager {
|
||||
result := &bindingManager{
|
||||
methods: make(map[string]*boundMethod),
|
||||
functions: make(map[string]*boundFunction),
|
||||
log: newCustomLogger("Bind"),
|
||||
methods: make(map[string]*boundMethod),
|
||||
functions: make(map[string]*boundFunction),
|
||||
log: newCustomLogger("Bind"),
|
||||
internalMethods: newInternalMethods(),
|
||||
}
|
||||
return result
|
||||
}
|
||||
@@ -163,6 +165,11 @@ func (b *bindingManager) bind(object interface{}) {
|
||||
b.objectsToBind = append(b.objectsToBind, object)
|
||||
}
|
||||
|
||||
func (b *bindingManager) processInternalCall(callData *callData) (interface{}, error) {
|
||||
// Strip prefix
|
||||
return b.internalMethods.processCall(callData)
|
||||
}
|
||||
|
||||
func (b *bindingManager) processFunctionCall(callData *callData) (interface{}, error) {
|
||||
// Return values
|
||||
var result []reflect.Value
|
||||
@@ -254,6 +261,8 @@ func (b *bindingManager) processCall(callData *callData) (result interface{}, er
|
||||
result, err = b.processFunctionCall(callData)
|
||||
case 2:
|
||||
result, err = b.processMethodCall(callData)
|
||||
case 3:
|
||||
result, err = b.processInternalCall(callData)
|
||||
default:
|
||||
result = nil
|
||||
err = fmt.Errorf("Invalid binding name '%s'", callData.BindingName)
|
||||
|
||||
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
package cmd
|
||||
|
||||
// Version - Wails version
|
||||
const Version = "v0.16.0"
|
||||
const Version = "v0.16.1"
|
||||
|
||||
@@ -6,6 +6,7 @@ type Runtime struct {
|
||||
Log *RuntimeLog
|
||||
Dialog *RuntimeDialog
|
||||
Window *RuntimeWindow
|
||||
Browser *RuntimeBrowser
|
||||
FileSystem *RuntimeFileSystem
|
||||
}
|
||||
|
||||
@@ -15,6 +16,7 @@ func newRuntime(eventManager *eventManager, renderer Renderer) *Runtime {
|
||||
Log: newRuntimeLog(),
|
||||
Dialog: newRuntimeDialog(renderer),
|
||||
Window: newRuntimeWindow(renderer),
|
||||
Browser: newRuntimeBrowser(),
|
||||
FileSystem: newRuntimeFileSystem(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package wails
|
||||
|
||||
import "github.com/pkg/browser"
|
||||
|
||||
// GlobalRuntimeBrowser is the global instance of the RuntimeBrowser object
|
||||
// Why? Because we need to use it in both the runtime and from the frontend
|
||||
var GlobalRuntimeBrowser = newRuntimeBrowser()
|
||||
|
||||
// RuntimeBrowser exposes browser methods to the runtime
|
||||
type RuntimeBrowser struct {
|
||||
}
|
||||
|
||||
func newRuntimeBrowser() *RuntimeBrowser {
|
||||
return &RuntimeBrowser{}
|
||||
}
|
||||
|
||||
// OpenURL opens the given url in the system's default browser
|
||||
func (r *RuntimeBrowser) OpenURL(url string) error {
|
||||
return browser.OpenURL(url)
|
||||
}
|
||||
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
@@ -200,6 +200,11 @@
|
||||
})
|
||||
}
|
||||
|
||||
// systemCall is used to call wails methods from the frontend
|
||||
function systemCall(method, data) {
|
||||
return call(".wails." + method, data);
|
||||
}
|
||||
|
||||
// Called by the backend to return data to a previously called
|
||||
// binding invocation
|
||||
function callback(incomingMessage) {
|
||||
@@ -285,6 +290,17 @@
|
||||
|
||||
/************************************************************/
|
||||
|
||||
/************************* Browser **************************/
|
||||
|
||||
|
||||
function openURL(url) {
|
||||
return systemCall("browser.openURL", url);
|
||||
}
|
||||
|
||||
window.wails.browser = {
|
||||
openURL
|
||||
}
|
||||
|
||||
/************************* Logging **************************/
|
||||
|
||||
// Sends a log message to the backend with the given
|
||||
|
||||
Reference in New Issue
Block a user