1
0

Switched to new method for nickel_extras:web_browser and implemented url/css options (closes #49) (#50)

* Switched to new method for nickel_extras:web_browser.
* Added support for fw versions less than 4.11.11911 for nickel_extras:web_browser action.
* Added modal, URL, and CSS options to nickel_extras:web_browser.
This commit is contained in:
Patrick Gaskin
2020-06-20 15:08:12 -04:00
committed by GitHub
parent 50c7374fcf
commit 7de21b827c
2 changed files with 69 additions and 28 deletions

View File

@@ -52,7 +52,12 @@
# screenshots - toggles FeatureSettings.Screenshots # screenshots - toggles FeatureSettings.Screenshots
# force_wifi - toggles DeveloperSettings.ForceWifiOn (note: the setting doesn't apply until you toggle WiFi) # force_wifi - toggles DeveloperSettings.ForceWifiOn (note: the setting doesn't apply until you toggle WiFi)
# nickel_extras - the mimetype of the plugin, or one of: # nickel_extras - the mimetype of the plugin, or one of:
# web_browser # web_browser - opens the web browser to the default homepage
# web_browser:<url> - opens the web browser to the specified URL
# web_browser:<url> <css> - opens the web browser to the specified URL and injects the specified CSS (which can contain spaces and colons) into all pages
# web_browser:modal - opens the web browser to the default homepage as a pop-up window
# web_browser:modal:<url> - see above
# web_browser:modal:<url> <css> - see above
# unblock_it # unblock_it
# sketch_pad # sketch_pad
# solitaire # solitaire

View File

@@ -295,43 +295,79 @@ NM_ACTION_(nickel_setting) {
NM_ACTION_(nickel_extras) { NM_ACTION_(nickel_extras) {
#define NM_ERR_RET nullptr #define NM_ERR_RET nullptr
if (!strcmp(arg, "web_browser")) { if (!strncmp(arg, "web_browser", 11)) {
//libnickel 4.6 * _ZN26N3SettingsExtrasControllerC2Ev bool modal;
void (*N3SettingsExtrasController_N3SettingsExtrasController)(N3SettingsExtrasController*); QUrl *url;
reinterpret_cast<void*&>(N3SettingsExtrasController_N3SettingsExtrasController) = dlsym(RTLD_DEFAULT, "_ZN26N3SettingsExtrasControllerC2Ev"); QString *css;
NM_ASSERT(N3SettingsExtrasController_N3SettingsExtrasController, "could not dlsym N3SettingsExtrasController constructor");
//libnickel 4.6 * _ZN26N3SettingsExtrasControllerD1Ev if (!strcmp(arg, "web_browser")) {
void (*N3SettingsExtrasController_N3SettingsExtrasControllerD)(N3SettingsExtrasController*); modal = false;
reinterpret_cast<void*&>(N3SettingsExtrasController_N3SettingsExtrasControllerD) = dlsym(RTLD_DEFAULT, "_ZN26N3SettingsExtrasControllerD1Ev"); url = new QUrl();
NM_ASSERT(N3SettingsExtrasController_N3SettingsExtrasControllerD, "could not dlsym N3SettingsExtrasController destructor"); css = new QString("");
} else {
char *tmp1 = strdupa(arg); // strsep and strtrim will modify it
char *arg1 = strtrim(strsep(&tmp1, ":"));
char *arg2 = strtrim(tmp1);
//libnickel 4.6 * _ZN26N3SettingsExtrasController11openBrowserEv if (!arg2 || strcmp(arg1, "web_browser"))
void (*N3SettingsExtrasController_openBrowser)(N3SettingsExtrasController*); NM_RETURN_ERR("unknown beta feature name or plugin mimetype '%s' (split: '%s')", arg, arg1);
reinterpret_cast<void*&>(N3SettingsExtrasController_openBrowser) = dlsym(RTLD_DEFAULT, "_ZN26N3SettingsExtrasController11openBrowserEv");
NM_ASSERT(N3SettingsExtrasController_openBrowser, "could not dlsym BrowserWorkflowManager::openBrowser");
N3SettingsExtrasController *nse = alloca(128); // as of 4.20.14622, it's actually 48 bytes, but we're going to stay on the safe side QString tmp = QString::fromUtf8(arg2).trimmed();
N3SettingsExtrasController_N3SettingsExtrasController(nse);
N3SettingsExtrasController_openBrowser(nse);
N3SettingsExtrasController_N3SettingsExtrasControllerD(nse);
// the QObject is only used to pass events to it, but there's something I'm missing here which leads to it segfaulting after connecting to WiFi if it isn't already connected if (tmp.section(':', 0, 0).trimmed() == "modal") {
/* modal = true;
//libnickel 4.11.11911 * _ZN22BrowserWorkflowManagerC1EP7QObject tmp = tmp.section(':', 1).trimmed();
void (*BrowserWorkflowManager_BrowserWorkflowManager)(BrowserWorkflowManager*, QObject*); } else {
modal = false;
}
if (tmp.contains(' ')) {
css = new QString(tmp.section(' ', 1).trimmed());
url = new QUrl(tmp.section(' ', 0, 0).trimmed(), QUrl::ParsingMode::StrictMode);
if (!url->isValid() || url->isRelative())
NM_RETURN_ERR("invalid url '%s' (argument: '%s') (note: if your url has spaces, they need to be escaped)", qPrintable(tmp.section(' ', 0, 0)), arg);
} else if (tmp.length()) {
url = new QUrl(tmp, QUrl::ParsingMode::StrictMode);
css = new QString("");
if (!url->isValid() || url->isRelative())
NM_RETURN_ERR("invalid url '%s' (argument: '%s') (note: if your url has spaces, they need to be escaped)", qPrintable(tmp.section(' ', 0, 0)), arg);
} else {
url = new QUrl();
css = new QString("");
}
}
NM_LOG("web browser '%s' (modal=%d, url='%s', css='%s')", arg, modal, url->isValid() ? qPrintable(url->toString()) : "(home)", qPrintable(*css));
//libnickel 4.6 * _ZN22BrowserWorkflowManager14sharedInstanceEv _ZN22BrowserWorkflowManagerC1EP7QObject
BrowserWorkflowManager *(*BrowserWorkflowManager_sharedInstance)();
void (*BrowserWorkflowManager_BrowserWorkflowManager)(BrowserWorkflowManager*, QObject*); // 4.11.11911+
reinterpret_cast<void*&>(BrowserWorkflowManager_sharedInstance) = dlsym(RTLD_DEFAULT, "_ZN22BrowserWorkflowManager14sharedInstanceEv");
reinterpret_cast<void*&>(BrowserWorkflowManager_BrowserWorkflowManager) = dlsym(RTLD_DEFAULT, "_ZN22BrowserWorkflowManagerC1EP7QObject"); reinterpret_cast<void*&>(BrowserWorkflowManager_BrowserWorkflowManager) = dlsym(RTLD_DEFAULT, "_ZN22BrowserWorkflowManagerC1EP7QObject");
NM_ASSERT(BrowserWorkflowManager_BrowserWorkflowManager, "could not dlsym BrowserWorkflowManager constructor"); NM_ASSERT(BrowserWorkflowManager_sharedInstance || BrowserWorkflowManager_BrowserWorkflowManager, "could not dlsym BrowserWorkflowManager constructor (4.11.11911+) or sharedInstance");
//libnickel 4.6 * _ZN22BrowserWorkflowManager11openBrowserEbRK4QUrlRK7QString //libnickel 4.6 * _ZN22BrowserWorkflowManager11openBrowserEbRK4QUrlRK7QString
void (*BrowserWorkflowManager_openBrowser)(BrowserWorkflowManager*, bool, QUrl const&, QString const&); // the bool is whether to open it as a modal, the string is CSS to inject void (*BrowserWorkflowManager_openBrowser)(BrowserWorkflowManager*, bool, QUrl*, QString*); // the bool is whether to open it as a modal, the QUrl is the URL to load(if !QUrl::isValid(), it loads the homepage), the string is CSS to inject
reinterpret_cast<void*&>(BrowserWorkflowManager_openBrowser) = dlsym(RTLD_DEFAULT, "_ZN22BrowserWorkflowManager11openBrowserEbRK4QUrlRK7QString"); reinterpret_cast<void*&>(BrowserWorkflowManager_openBrowser) = dlsym(RTLD_DEFAULT, "_ZN22BrowserWorkflowManager11openBrowserEbRK4QUrlRK7QString");
NM_ASSERT(BrowserWorkflowManager_openBrowser, "could not dlsym BrowserWorkflowManager::openBrowser"); NM_ASSERT(BrowserWorkflowManager_openBrowser, "could not dlsym BrowserWorkflowManager::openBrowser");
BrowserWorkflowManager *bwm = alloca(128); // as of 4.20.14622, it's actually 20 bytes, but we're going to stay on the safe side // note: everything must be on the heap since if it isn't connected, it
BrowserWorkflowManager_BrowserWorkflowManager(bwm, new QObject()); // passes it as-is to the connected signal, which will be used
BrowserWorkflowManager_openBrowser(bwm, false, QUrl(), QStringLiteral("")); // if !QUrl::isValid(), it loads the homepage // after this action returns.
*/
BrowserWorkflowManager *bwm;
if (BrowserWorkflowManager_BrowserWorkflowManager) {
bwm = calloc(1, 128); // as of 4.20.14622, it's actually 20 bytes, but we're going to stay on the safe side
NM_ASSERT(bwm, "could not allocate memory for BrowserWorkflowManager");
BrowserWorkflowManager_BrowserWorkflowManager(bwm, nullptr);
} else {
bwm = BrowserWorkflowManager_sharedInstance();
NM_ASSERT(bwm, "could not get shared browser workflow manager pointer");
}
BrowserWorkflowManager_openBrowser(bwm, modal, url, css);
NM_RETURN_OK(nm_action_result_silent()); NM_RETURN_OK(nm_action_result_silent());
} }