') + ')', '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); } })(); })(); wrap exceptions from callbacks in QuicError.CallbackError by wfurt · Pull Request #88614 · dotnet/runtime · GitHub
Skip to content

wrap exceptions from callbacks in QuicError.CallbackError - #88614

Merged
wfurt merged 3 commits into
dotnet:mainfrom
wfurt:CallbackError
Jul 17, 2023
Merged

wrap exceptions from callbacks in QuicError.CallbackError#88614
wfurt merged 3 commits into
dotnet:mainfrom
wfurt:CallbackError

Conversation

@wfurt

Copy link
Copy Markdown
Member

contributes to #75115.
It uses newly approved QuicError.CallbackError to make it clear what is coming from outside of core Quic.
I was originally thinking about inner try/catch but I decided too keep simple state variable to track if exception needs to be wrapped to keep it simple.

I also added test for scenario described in #75115 e.g. ODE leaking up but not stopping listener.

@wfurtwfurt added this to the 8.0.0 milestone Jul 10, 2023
@wfurt
wfurt requested review from a team and ManickaPJuly 10, 2023 17:45
@wfurtwfurt self-assigned this Jul 10, 2023
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

Issue Details

contributes to #75115.
It uses newly approved QuicError.CallbackError to make it clear what is coming from outside of core Quic.
I was originally thinking about inner try/catch but I decided too keep simple state variable to track if exception needs to be wrapped to keep it simple.

I also added test for scenario described in #75115 e.g. ODE leaking up but not stopping listener.

Author:wfurt
Assignees:wfurt
Labels:

area-System.Net.Quic

Milestone:8.0.0

@ManickaPManickaP left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is there a downside of wrapping the callback calls with extra try-catch block? Or why did you chose to introduce the extra boolean?

@wfurt

Copy link
Copy Markdown
MemberAuthor

Is there a downside of wrapping the callback calls with extra try-catch block? Or why did you chose to introduce the extra boolean?

I generally consider trow catch expensive operation. But I don't have any numbers for this particular case. And personally I'm not fan of too much of nesting.

@ManickaPManickaP left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM modulo comments, thanks.

Comment threadsrc/libraries/System.Net.Quic/src/System/Net/Quic/QuicListener.cs Outdated
Comment threadsrc/libraries/System.Net.Quic/src/System/Net/Quic/QuicListener.cs Outdated
@wfurt

Copy link
Copy Markdown
MemberAuthor

counter test failure looks unrelated.

@wfurt
wfurt merged commit bf78b40 into dotnet:mainJul 17, 2023
@wfurt
wfurt deleted the CallbackError branch July 17, 2023 22:08
@ghostghost locked as resolved and limited conversation to collaborators Aug 17, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@wfurt@ManickaP