') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Remove 'parent' argument from wx StatusBarManager by greschd · Pull Request #1192 · enthought/pyface · GitHub
Skip to content

Remove 'parent' argument from wx StatusBarManager - #1192

Merged
corranwebster merged 2 commits into
enthought:mainfrom
greschd:fix/wx_status_bar_destroy
Jan 11, 2023
Merged

Remove 'parent' argument from wx StatusBarManager#1192
corranwebster merged 2 commits into
enthought:mainfrom
greschd:fix/wx_status_bar_destroy

Conversation

@greschd

Copy link
Copy Markdown
Contributor

Another small fix:

Remove the 'parent' argument from 'StatusBarManager.destroy' in the wx backend. The argument is unused, and doesn't match the interface definition.

If you prefer keeping the argument (to not break applications which may pass it explicitly?), I'd propose adding a default =None, and emitting a deprecation warning.

Remove the 'parent' argument from 'StatusBarManager.destroy' in the
WX implementation. The argument is unused, and doesn't match the
interface definition.

@corranwebstercorranwebster left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once again, thanks for the PR. This probably needs a corresponding change to the call here:

old.destroy(self.control)

@greschd

Copy link
Copy Markdown
ContributorAuthor

Good catch, I've adapted the call site now.

I wonder if we should add some kind of test? Originally, I stumbled upon this because our code triggered the following exception:

Traceback (most recent call last):
File "d:\ansysdev\thirdparty_sources\pyface\pyface\ui\wx\window.py", line 189, in _wx_on_close
self.close()
File "d:\ansysdev\thirdparty_sources\pyface\pyface\workbench\workbench_window.py", line 202, in close
self.destroy()
File "d:\ansysdev\thirdparty_sources\pyface\pyface\ui\wx\application_window.py", line 154, in destroy
super().destroy()
File "d:\ansysdev\thirdparty_sources\pyface\pyface\i_application_window.py", line 133, in destroy
self.status_bar_manager.destroy()
TypeError: StatusBarManager.destroy() missing 1 required positional argument: 'parent'

@corranwebster

Copy link
Copy Markdown
Contributor

I wonder if we should add some kind of test?

There are tests for the create/destroy aspects of the StatusBarManager API that would have detected the problem here:

deftest_statusbar(self):
# test that status bar gets created as expected
self.window.status_bar_manager=StatusBarManager(
message="hello world"
)
withself.event_loop():
self.window._create()
withself.event_loop():
self.window.show(True)
withself.event_loop():
self.window.show(False)
withself.event_loop():
self.window.close()
deftest_statusbar_changed(self):
# test that status bar gets changed as expected
self.window.status_bar_manager=StatusBarManager(
message="hello world"
)
withself.event_loop():
self.window._create()
withself.event_loop():
self.window.show(True)
withself.event_loop():
self.window.status_bar_manager=StatusBarManager(
message="goodbye world"
)
withself.event_loop():
self.window.show(False)
withself.event_loop():
self.window.close()

Unfortunately those tests need the GuiTestAssistant class which we haven't yet integrated for WxPython (see #614 and #266 - the primary obstacle is not writing the class, it's getting everything running correctly once you have it).

So the long and short of it is, no, no need to write a test, and this looks good to go.

@corranwebster
corranwebster merged commit c737dcd into enthought:mainJan 11, 2023
@greschd

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review, and the context on testing!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@greschd@corranwebster