From cbc0d757c6e6c2b9a3ff9a70138d260b352c8aef Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Mon, 8 May 2023 13:22:04 +0800 Subject: [PATCH 1/5] Restructure resources to allow for deployment insertions. --- web/setup.cfg | 1 + web/src/toga_web/inserts/index.html:header | 4 ++++ web/src/toga_web/{static => inserts}/toga.css | 0 3 files changed, 5 insertions(+) create mode 100644 web/src/toga_web/inserts/index.html:header rename web/src/toga_web/{static => inserts}/toga.css (100%) diff --git a/web/setup.cfg b/web/setup.cfg index 2e5d058c4b..d817cda9d6 100644 --- a/web/setup.cfg +++ b/web/setup.cfg @@ -52,6 +52,7 @@ toga.backends = [options.package_data] toga_web = + inserts/** static/** [options.packages.find] diff --git a/web/src/toga_web/inserts/index.html:header b/web/src/toga_web/inserts/index.html:header new file mode 100644 index 0000000000..9418e45fe3 --- /dev/null +++ b/web/src/toga_web/inserts/index.html:header @@ -0,0 +1,4 @@ + + diff --git a/web/src/toga_web/static/toga.css b/web/src/toga_web/inserts/toga.css similarity index 100% rename from web/src/toga_web/static/toga.css rename to web/src/toga_web/inserts/toga.css From ca7d8566c4fbbe0998a6a80f784b6170cd2c9038 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Mon, 22 May 2023 10:43:59 +0800 Subject: [PATCH 2/5] Add a presumptive CI configuration. --- .github/workflows/ci.yml | 7 ++++++- testbed/pyproject.toml | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a727ee7a42..216a078648 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -189,7 +189,7 @@ jobs: strategy: fail-fast: false matrix: - backend: [ "macOS", "windows", "linux", "android", "iOS" ] + backend: [ "macOS", "windows", "linux", "android", "iOS", "web" ] include: - pre-command: briefcase-run-prefix: @@ -220,6 +220,11 @@ jobs: - backend: android runs-on: macos-12 briefcase-run-args: " -d '{\"avd\":\"beePhone\"}' --Xemulator=-no-window --Xemulator=-no-snapshot --Xemulator=-no-audio --Xemulator=-no-boot-anim --shutdown-on-exit" + + - backend: web + runs-on: ubuntu-22.04 + briefcase-run-args: " --no-browser" + steps: - uses: actions/checkout@v3.5.2 with: diff --git a/testbed/pyproject.toml b/testbed/pyproject.toml index d75962b8e2..0e7348c6e0 100644 --- a/testbed/pyproject.toml +++ b/testbed/pyproject.toml @@ -97,4 +97,5 @@ build_gradle_extra_content = "android.defaultConfig.python.extractPackages 'toga requires = [ "../web" ] -style_framework = "Shoelace v2.3" +# FIXME: needed for test purposes to use a pre-release template. +template_branch = "web-test" From 2f98188c58a7ed59360c016c89d44797862a0d3c Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Tue, 18 Jul 2023 15:32:10 +0200 Subject: [PATCH 3/5] Resurrect the webview widget. --- examples/tutorial3/tutorial/app.py | 14 ++++------ web/src/toga_web/factory.py | 5 ++-- web/src/toga_web/inserts/toga.css | 3 ++ web/src/toga_web/widgets/webview.py | 43 +++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 web/src/toga_web/widgets/webview.py diff --git a/examples/tutorial3/tutorial/app.py b/examples/tutorial3/tutorial/app.py index 309cd07655..58a107c0ac 100644 --- a/examples/tutorial3/tutorial/app.py +++ b/examples/tutorial3/tutorial/app.py @@ -1,5 +1,5 @@ import toga -from toga.style.pack import CENTER, COLUMN, ROW, Pack +from toga.style.pack import COLUMN, ROW, Pack class Graze(toga.App): @@ -7,10 +7,12 @@ def startup(self): self.main_window = toga.MainWindow(title=self.name) self.webview = toga.WebView( - on_webview_load=self.on_webview_loaded, style=Pack(flex=1) + on_webview_load=self.on_webview_loaded, + style=Pack(flex=1), ) self.url_input = toga.TextInput( - value="https://beeware.org/", style=Pack(flex=1) + value="https://beeware.org/", + style=Pack(flex=1), ) box = toga.Box( @@ -24,11 +26,7 @@ def startup(self): style=Pack(width=50, padding_left=5), ), ], - style=Pack( - direction=ROW, - alignment=CENTER, - padding=5, - ), + style=Pack(direction=ROW, padding=5), ), self.webview, ], diff --git a/web/src/toga_web/factory.py b/web/src/toga_web/factory.py index be253f674f..5cc5335c74 100644 --- a/web/src/toga_web/factory.py +++ b/web/src/toga_web/factory.py @@ -32,7 +32,8 @@ from .widgets.textinput import TextInput # from .widgets.tree import Tree -# from .widgets.webview import WebView +from .widgets.webview import WebView + # from .window import Window @@ -72,7 +73,7 @@ def not_implemented(feature): # 'Table', "TextInput", # 'Tree', - # 'WebView', + "WebView", # 'Window', ] diff --git a/web/src/toga_web/inserts/toga.css b/web/src/toga_web/inserts/toga.css index 6cc3929e3c..0278853371 100644 --- a/web/src/toga_web/inserts/toga.css +++ b/web/src/toga_web/inserts/toga.css @@ -10,6 +10,8 @@ html, body { height: 100%; margin: 0; + display: flex; + flex-direction: column; } /* If a custom element hasn't been defined yet, hide it from rendering */ @@ -79,6 +81,7 @@ main.toga.window { overflow: hidden; display: flex; flex-direction: column; + flex-grow: 1; } main.toga.window > .container { diff --git a/web/src/toga_web/widgets/webview.py b/web/src/toga_web/widgets/webview.py new file mode 100644 index 0000000000..47babc8e26 --- /dev/null +++ b/web/src/toga_web/widgets/webview.py @@ -0,0 +1,43 @@ +from travertino.size import at_least + +from toga.widgets.webview import JavaScriptResult + +from .base import Widget + + +class WebView(Widget): + def create(self): + self.native = self._create_native_widget("iframe") + + def get_url(self): + url = str(self.native.src) + return None if url == "about:blank" else url + + def set_url(self, value, future=None): + if value: + self.native.src = value + else: + self.native.src = "about:blank" + + self.loaded_future = future + + def set_content(self, root_url, content): + pass + # self.native.loadHTMLString(content, baseURL=NSURL.URLWithString(root_url)) + + def get_user_agent(self): + # return str(self.native.valueForKey("userAgent")) + return "user agent?" + + def set_user_agent(self, value): + # self.native.customUserAgent = value + pass + + def evaluate_javascript(self, javascript: str, on_result=None) -> str: + result = JavaScriptResult() + + return result + + def rehint(self): + self.interface.intrinsic.width = at_least(self.interface._MIN_WIDTH) + self.interface.intrinsic.height = at_least(self.interface._MIN_HEIGHT) From 30130b93bc85e98b594b184fa91306ad50f0e115 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Sun, 23 Jul 2023 10:08:48 +0200 Subject: [PATCH 4/5] Ensure the toga web backend has a reference to the current asyncio event loop. --- web/src/toga_web/app.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/src/toga_web/app.py b/web/src/toga_web/app.py index 808ca748d5..b56d101c40 100644 --- a/web/src/toga_web/app.py +++ b/web/src/toga_web/app.py @@ -1,3 +1,5 @@ +import asyncio + import toga from toga_web.libs import create_element, js from toga_web.window import Window @@ -12,6 +14,7 @@ class App: def __init__(self, interface): self.interface = interface self.interface._impl = self + self.loop = asyncio.get_event_loop() def create(self): # self.resource_path = os.path.dirname(os.path.dirname(NSBundle.mainBundle.bundlePath)) From 51dc80d41afd6edb2c4baf820f87ec0fdd6f588a Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Wed, 26 Jul 2023 13:36:27 +0800 Subject: [PATCH 5/5] Make the default page font sans-serif. --- web/src/toga_web/inserts/toga.css | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/toga_web/inserts/toga.css b/web/src/toga_web/inserts/toga.css index 0278853371..50d34f31d2 100644 --- a/web/src/toga_web/inserts/toga.css +++ b/web/src/toga_web/inserts/toga.css @@ -12,6 +12,7 @@ html, body { margin: 0; display: flex; flex-direction: column; + font-family: sans-serif; } /* If a custom element hasn't been defined yet, hide it from rendering */