URL filtering (URL sandbox) is used to decide which URLs are opened in a default web browser instead of Nuvola Player. For example, a Google Play Music user definitely doesn't want to open a Google Plus link in Nuvola Player, but in his default web browser.
Nuvola.WebApp looks at allowed_uri
field of metadata.json
.
If this field is not empty, it is compiled as a regular expression and stored at
WebApp.allowedURI
property. The default URL filter implemented in
Nuvola.WebApp._onNavigationRequest then allows
navigation only to URLs that match that regular expression, other URLs are opened in a default web
browser.
{ ... "allowed_uri": "^https?://(play\\.google\\.com/)" }
Since the default URL filter is a JavaScript function, you can override it to match your needs. The method Nuvola.WebApp._onNavigationRequest is a handler for Nuvola.Core::NavigationRequest signal.
var WebApp = Nuvola.$WebApp() ... WebApp._onNavigationRequest = function (emitter, request) { if (request.url === 'https://www.npr.org/') { // choice.npr.org redirects to 'https://www.npr.org/' regardless of the original domain (one.npr.org) // Let's go to the home page instead of showing www.npr.org in a new window. request.url = 'https://one.npr.org/' request.approved = true } else { // Apply URL filter otherwise Nuvola.WebApp._onNavigationRequest.call(this, emitter, request) } } ...
Global window object not available
The Nuvola.Core::NavigationRequest signal is executed in a pure JavaScript environment without Window object. Use Nuvola.log() to print logging and debugging messages to terminal instead of console.log().
If you run Nuvola Player with -D
or --debug
flag, you will see URL filtering in action:
[Runner:DEBUG Nuvola] webengine.vala:443: Navigation, current window: uri = https://checkout.google.com/inapp/frontend/passive?&usid=0&plid=0, result = true, frame = (null), type = WEBKIT_NAVIGATION_TYPE_OTHER [Runner:DEBUG Nuvola] webengine.vala:440: Navigation, new window: uri = https://plus.google.com/u/0/?tab=YX, result = true, frame = _blank, type = WEBKIT_NAVIGATION_TYPE_LINK_CLICKED
The debugging message contains following information:
request.newWindow
).request.url
).request.approved
).URL filter works only for link clicks
While the Nuvola.Core::NavigationRequest signal
is currently emitted for all types of navigation, the result of the URL filter is taken into
account only for link clicks (WEBKIT_NAVIGATION_TYPE_LINK_CLICKED
). This may change in the
future.