summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2022-08-12 11:54:57 +0200
committerFlorian Bruhin <me@the-compiler.org>2022-08-12 11:54:57 +0200
commit662fa69912c22dc520a861c27b04ea2c23a5da37 (patch)
tree7350c237fb2926e36dbc85387097426a834e6fa6
parent3161a5b7e6cb0b140bbed687b13817d5dd6f3864 (diff)
downloadqutebrowser-662fa69912c22dc520a861c27b04ea2c23a5da37.tar.gz
qutebrowser-662fa69912c22dc520a861c27b04ea2c23a5da37.zip
Surface internal/userscript JS errors as messages
Configurable via a new content.javascript.log_message setting. Closes #7173, driven by #7335.
-rw-r--r--doc/changelog.asciidoc5
-rw-r--r--doc/help/settings.asciidoc18
-rw-r--r--qutebrowser/browser/shared.py24
-rw-r--r--qutebrowser/config/configdata.yml23
-rw-r--r--qutebrowser/javascript/greasemonkey_wrapper.js4
5 files changed, 70 insertions, 4 deletions
diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc
index 1a7800dd8..3b5eb2b1d 100644
--- a/doc/changelog.asciidoc
+++ b/doc/changelog.asciidoc
@@ -29,6 +29,9 @@ Added
prompts (bound to `<Alt+e>` by default).
- New `clock` value for `statusbar.widgets`, displaying the current time.
- New `qute://start` built-in start page (not set as the default start page yet).
+- New `content.javascript.log_message` setting, allowing to surface JS log
+ messages as qutebrowser messages (rather than only logging them). By default,
+ errors in internal `qute:` pages and userscripts are shown to the user.
- New `qute-1pass` userscript using the 1password commandline to fill
passwords.
- New features in userscripts:
@@ -87,6 +90,8 @@ Changed
- Improved output when loading Greasemonkey scripts.
- The macOS `.app` now is registered as a handler for `.mhtml` files, such as
the ones produced by `:download --mhtml`.
+- The "... called unimplemented GM_..." messages are now logged as info JS
+ messages instead of errors.
Fixed
~~~~~
diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc
index b16fe2a06..e4eb594b5 100644
--- a/doc/help/settings.asciidoc
+++ b/doc/help/settings.asciidoc
@@ -172,6 +172,7 @@
|<<content.javascript.clipboard,content.javascript.clipboard>>|Allow JavaScript to read from or write to the clipboard.
|<<content.javascript.enabled,content.javascript.enabled>>|Enable JavaScript.
|<<content.javascript.log,content.javascript.log>>|Log levels to use for JavaScript console logging messages.
+|<<content.javascript.log_message,content.javascript.log_message>>|Javascript message sources/levels to show in the qutebrowser UI.
|<<content.javascript.modal_dialog,content.javascript.modal_dialog>>|Use the standard JavaScript modal dialog for `alert()` and `confirm()`.
|<<content.javascript.prompt,content.javascript.prompt>>|Show javascript prompts.
|<<content.local_content_can_access_file_urls,content.local_content_can_access_file_urls>>|Allow locally loaded documents to access other local URLs.
@@ -2400,6 +2401,23 @@ Default:
- +pass:[unknown]+: +pass:[debug]+
- +pass:[warning]+: +pass:[debug]+
+[[content.javascript.log_message]]
+=== content.javascript.log_message
+Javascript message sources/levels to show in the qutebrowser UI.
+When a JavaScript message is logged from a location matching the glob pattern given in the key, and is from one of the levels listed as value, it's surfaced as a message in the qutebrowser UI.
+By default, errors happening in qutebrowser internally or in userscripts are shown to the user.
+
+Type: <<types,Dict>>
+
+Default:
+
+- +pass:[qute:*]+:
+
+* +pass:[error]+
+- +pass:[userscript:*]+:
+
+* +pass:[error]+
+
[[content.javascript.modal_dialog]]
=== content.javascript.modal_dialog
Use the standard JavaScript modal dialog for `alert()` and `confirm()`.
diff --git a/qutebrowser/browser/shared.py b/qutebrowser/browser/shared.py
index 54c466415..b75f7dab0 100644
--- a/qutebrowser/browser/shared.py
+++ b/qutebrowser/browser/shared.py
@@ -25,6 +25,7 @@ import html
import enum
import netrc
import tempfile
+import fnmatch
from typing import Callable, Mapping, List, Optional, Iterable, Iterator
from PyQt5.QtCore import QUrl, pyqtBoundSignal
@@ -149,11 +150,30 @@ _JS_LOGMAP: Mapping[str, Callable[[str], None]] = {
'warning': log.js.warning,
'error': log.js.error,
}
+# Callables to use for content.javascript.log_message.
+# Note that the keys are JS log levels here, not config settings!
+_JS_LOGMAP_MESSAGE: Mapping[usertypes.JsLogLevel, Callable[[str], None]] = {
+ usertypes.JsLogLevel.info: message.info,
+ usertypes.JsLogLevel.warning: message.warning,
+ usertypes.JsLogLevel.error: message.error,
+}
-def javascript_log_message(level, source, line, msg):
+def javascript_log_message(
+ level: usertypes.JsLogLevel,
+ source: str,
+ line: int,
+ msg: str,
+):
"""Display a JavaScript log message."""
- logstring = "[{}:{}] {}".format(source, line, msg)
+ logstring = f"[{source}:{line}] {msg}"
+
+ for pattern, levels in config.cache['content.javascript.log_message'].items():
+ if level.name in levels and fnmatch.fnmatchcase(source, pattern):
+ func = _JS_LOGMAP_MESSAGE[level]
+ func(f"JS: {logstring}")
+ return
+
logger = _JS_LOGMAP[config.cache['content.javascript.log'][level.name]]
logger(logstring)
diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml
index 4da003b37..220712e2d 100644
--- a/qutebrowser/config/configdata.yml
+++ b/qutebrowser/config/configdata.yml
@@ -940,6 +940,29 @@ content.javascript.log:
The following levels are valid: `none`, `debug`, `info`, `warning`,
`error`.
+content.javascript.log_message:
+ type:
+ name: Dict
+ keytype: String
+ valtype:
+ name: FlagList
+ valid_values:
+ - info: Show JS info as messages.
+ - warning: Show JS warnings as messages.
+ - error: Show JS errors as messages.
+ default:
+ "qute:*": ["error"]
+ "userscript:*": ["error"]
+ desc: >-
+ Javascript message sources/levels to show in the qutebrowser UI.
+
+ When a JavaScript message is logged from a location matching the glob
+ pattern given in the key, and is from one of the levels listed as value,
+ it's surfaced as a message in the qutebrowser UI.
+
+ By default, errors happening in qutebrowser internally or in userscripts are
+ shown to the user.
+
content.javascript.modal_dialog:
type: Bool
default: false
diff --git a/qutebrowser/javascript/greasemonkey_wrapper.js b/qutebrowser/javascript/greasemonkey_wrapper.js
index ced4e1063..d36328282 100644
--- a/qutebrowser/javascript/greasemonkey_wrapper.js
+++ b/qutebrowser/javascript/greasemonkey_wrapper.js
@@ -129,11 +129,11 @@
// Stub these two so that the gm4 polyfill script doesn't try to
// create broken versions as attributes of window.
function GM_getResourceText(caption, commandFunc, accessKey) {
- console.error(`${GM_info.script.name} called unimplemented GM_getResourceText`);
+ console.info(`${GM_info.script.name} called unimplemented GM_getResourceText`);
}
function GM_registerMenuCommand(caption, commandFunc, accessKey) {
- console.error(`${GM_info.script.name} called unimplemented GM_registerMenuCommand`);
+ console.info(`${GM_info.script.name} called unimplemented GM_registerMenuCommand`);
}
// Mock the greasemonkey 4.0 async API.