Prevent negative width or height on rect - #2482

Closed
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1
Closed

Prevent negative width or height on rect#2482
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1

Conversation

@vdh

@vdhvdh commented Mar 20, 2018

Copy link
Copy Markdown
Contributor

When working with responsive container sizes for charts, I've encountered Error: <rect> attribute height: A negative value is not valid. DOM errors (Chrome 65.0.3325.162). Because the container area is sometimes too small for a reasonable chart, the _length calculations sometimes go into the negatives.

This PR is just a simple guard to avoid setting invalid negative values on the rect elements.

Prevent "Error: <rect> attribute height: A negative value is not valid." DOM errors when very small chart sizes causes `_length` calculations to go into the negatives.
@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much for bringing this up! I'm not convinced your patch is the best way to fix this bug though. _length shouldn't be negative in the first place when reaching this part of the code.

Would you mind sharing a reproducible example that exhibits the DOM errors you're referring to?

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard
I was able to recreate it in CodePen ( https://codepen.io/vdh/pen/WzpOoe ), although it may be connected to react-plotly.js's useResizeHandler option (or the Plotly.Plots.resize call it wraps…?).

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

I've managed to make a smaller demo https://codepen.io/vdh/pen/OvpjmX
For some reason useResizeHandler / Plotly.Plots.resize is causing it, but I haven't been able to dig deeper yet as it would require reverse-engineering the code of react-plotly.js to recreate the Plotly calls.

@n-riesco

Copy link
Copy Markdown
Contributor

@vdh I see the same issue with react-chart-editor (see my comment here). In my case, an easy way to trigger this issue is to set display: none in the container node and trigger a resize.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

I'm assuming what's happening here is the margins are larger than the plot area - ie margin.l + margin.r > width, either because width is very small or we can't determine it at all (invisible node cc @n-riesco ). These situations are going to arise from time to time, and we shouldn't barf of course... if width or height is <=0 we should bail out of plotting entirely (and early), and if the margins are too big to display anything... dunno what makes most sense here, either shrink the margins so we still have plotting space, or just display the title and bail?

@vdh

vdh commented Apr 16, 2018

Copy link
Copy Markdown
ContributorAuthor

I also discovered two additional places where rects are given negative widths for tiny charts (and added guards to the PR):

  • drawing.setRect / drawing.setSize in src/components/drawing/index.js
  • axes.makeClipPaths in src/plots/cartesian/axes.js

@etpinard@alexcjohnson
I know these guards don't directly address the code that generates the negative dimensions, but is it really so bad to guard against the generation of invalid SVG attributes? These DOM errors create a lot of noise in the console.

@etpinard

Copy link
Copy Markdown
Contributor

I also discovered two additional places where rects are given negative widths for tiny charts

Right. This is exactly why we're hoping to find the root cause of this problem.

Instead of patching every piece of code that might write negative svg width/height, we should (at least try to) make sure _length and other positive definite fields don't become negative in the first place.

@etpinard

etpinard commented Apr 16, 2018

Copy link
Copy Markdown
Contributor

... to do so, we'll need some sort of reproducible example in plotly.js.

@grahambryan

grahambryan commented May 1, 2018

Copy link
Copy Markdown

Has there been any resolution to this problem? I have been running into the same problem within react-plotly.js within my react app.

Error: attribute width: A negative value is not valid. ("-50") @ plotly.js:17171

@vdh

vdh commented May 2, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard

... to do so, we'll need some sort of reproducible example in plotly.js.

So are you implying that the CodePen examples I provided earlier are inadequate? Is there a better way to create an example? I apologise that I don't have the skills or familiarity with Plotly to separate react-plotly.js from the examples, but on Chrome 66.0.3359.139 I can reproduce the same console errors using those CodePens.

@etpinard

etpinard commented May 2, 2018

Copy link
Copy Markdown
Contributor

@vdh as far as I know no one has been able to reproduce this issue using only plotly.js (i.e. no react, no react-plotly.js). This doesn't mean plotly.js isn't doing something wrong here. But it would help you pin down why theses values are negative in the first place.

@etpinard

etpinard commented May 24, 2018

Copy link
Copy Markdown
Contributor

Ok. I was able to reproduce this bug in pure plotly.js.

See https://codepen.io/etpinard/pen/KRjKpg?editors=0010 and open the console to see the logs.

It seems to be a problem with Plots.resize (which is the plotly.js method called when react-plotly.js' useResizeHandler option is turned on).

Closing this PR and moving the discussion to #2663

@vdh
vdh deleted the patch-1 branch June 28, 2018 00:24
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.

5 participants

@vdh@etpinard@n-riesco@alexcjohnson@grahambryan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Prevent negative width or height on rect - #2482

Closed
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1
Closed

Prevent negative width or height on rect#2482
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1

Conversation

@vdh

@vdhvdh commented Mar 20, 2018

Copy link
Copy Markdown
Contributor

When working with responsive container sizes for charts, I've encountered Error: <rect> attribute height: A negative value is not valid. DOM errors (Chrome 65.0.3325.162). Because the container area is sometimes too small for a reasonable chart, the _length calculations sometimes go into the negatives.

This PR is just a simple guard to avoid setting invalid negative values on the rect elements.

Prevent "Error: <rect> attribute height: A negative value is not valid." DOM errors when very small chart sizes causes `_length` calculations to go into the negatives.
@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much for bringing this up! I'm not convinced your patch is the best way to fix this bug though. _length shouldn't be negative in the first place when reaching this part of the code.

Would you mind sharing a reproducible example that exhibits the DOM errors you're referring to?

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard
I was able to recreate it in CodePen ( https://codepen.io/vdh/pen/WzpOoe ), although it may be connected to react-plotly.js's useResizeHandler option (or the Plotly.Plots.resize call it wraps…?).

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

I've managed to make a smaller demo https://codepen.io/vdh/pen/OvpjmX
For some reason useResizeHandler / Plotly.Plots.resize is causing it, but I haven't been able to dig deeper yet as it would require reverse-engineering the code of react-plotly.js to recreate the Plotly calls.

@n-riesco

Copy link
Copy Markdown
Contributor

@vdh I see the same issue with react-chart-editor (see my comment here). In my case, an easy way to trigger this issue is to set display: none in the container node and trigger a resize.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

I'm assuming what's happening here is the margins are larger than the plot area - ie margin.l + margin.r > width, either because width is very small or we can't determine it at all (invisible node cc @n-riesco ). These situations are going to arise from time to time, and we shouldn't barf of course... if width or height is <=0 we should bail out of plotting entirely (and early), and if the margins are too big to display anything... dunno what makes most sense here, either shrink the margins so we still have plotting space, or just display the title and bail?

@vdh

vdh commented Apr 16, 2018

Copy link
Copy Markdown
ContributorAuthor

I also discovered two additional places where rects are given negative widths for tiny charts (and added guards to the PR):

  • drawing.setRect / drawing.setSize in src/components/drawing/index.js
  • axes.makeClipPaths in src/plots/cartesian/axes.js

@etpinard@alexcjohnson
I know these guards don't directly address the code that generates the negative dimensions, but is it really so bad to guard against the generation of invalid SVG attributes? These DOM errors create a lot of noise in the console.

@etpinard

Copy link
Copy Markdown
Contributor

I also discovered two additional places where rects are given negative widths for tiny charts

Right. This is exactly why we're hoping to find the root cause of this problem.

Instead of patching every piece of code that might write negative svg width/height, we should (at least try to) make sure _length and other positive definite fields don't become negative in the first place.

@etpinard

etpinard commented Apr 16, 2018

Copy link
Copy Markdown
Contributor

... to do so, we'll need some sort of reproducible example in plotly.js.

@grahambryan

grahambryan commented May 1, 2018

Copy link
Copy Markdown

Has there been any resolution to this problem? I have been running into the same problem within react-plotly.js within my react app.

Error: attribute width: A negative value is not valid. ("-50") @ plotly.js:17171

@vdh

vdh commented May 2, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard

... to do so, we'll need some sort of reproducible example in plotly.js.

So are you implying that the CodePen examples I provided earlier are inadequate? Is there a better way to create an example? I apologise that I don't have the skills or familiarity with Plotly to separate react-plotly.js from the examples, but on Chrome 66.0.3359.139 I can reproduce the same console errors using those CodePens.

@etpinard

etpinard commented May 2, 2018

Copy link
Copy Markdown
Contributor

@vdh as far as I know no one has been able to reproduce this issue using only plotly.js (i.e. no react, no react-plotly.js). This doesn't mean plotly.js isn't doing something wrong here. But it would help you pin down why theses values are negative in the first place.

@etpinard

etpinard commented May 24, 2018

Copy link
Copy Markdown
Contributor

Ok. I was able to reproduce this bug in pure plotly.js.

See https://codepen.io/etpinard/pen/KRjKpg?editors=0010 and open the console to see the logs.

It seems to be a problem with Plots.resize (which is the plotly.js method called when react-plotly.js' useResizeHandler option is turned on).

Closing this PR and moving the discussion to #2663

@vdh
vdh deleted the patch-1 branch June 28, 2018 00:24
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.

5 participants

@vdh@etpinard@n-riesco@alexcjohnson@grahambryan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Prevent negative width or height on rect - #2482

Closed
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1
Closed

Prevent negative width or height on rect#2482
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1

Conversation

@vdh

@vdhvdh commented Mar 20, 2018

Copy link
Copy Markdown
Contributor

When working with responsive container sizes for charts, I've encountered Error: <rect> attribute height: A negative value is not valid. DOM errors (Chrome 65.0.3325.162). Because the container area is sometimes too small for a reasonable chart, the _length calculations sometimes go into the negatives.

This PR is just a simple guard to avoid setting invalid negative values on the rect elements.

Prevent "Error: <rect> attribute height: A negative value is not valid." DOM errors when very small chart sizes causes `_length` calculations to go into the negatives.
@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much for bringing this up! I'm not convinced your patch is the best way to fix this bug though. _length shouldn't be negative in the first place when reaching this part of the code.

Would you mind sharing a reproducible example that exhibits the DOM errors you're referring to?

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard
I was able to recreate it in CodePen ( https://codepen.io/vdh/pen/WzpOoe ), although it may be connected to react-plotly.js's useResizeHandler option (or the Plotly.Plots.resize call it wraps…?).

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

I've managed to make a smaller demo https://codepen.io/vdh/pen/OvpjmX
For some reason useResizeHandler / Plotly.Plots.resize is causing it, but I haven't been able to dig deeper yet as it would require reverse-engineering the code of react-plotly.js to recreate the Plotly calls.

@n-riesco

Copy link
Copy Markdown
Contributor

@vdh I see the same issue with react-chart-editor (see my comment here). In my case, an easy way to trigger this issue is to set display: none in the container node and trigger a resize.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

I'm assuming what's happening here is the margins are larger than the plot area - ie margin.l + margin.r > width, either because width is very small or we can't determine it at all (invisible node cc @n-riesco ). These situations are going to arise from time to time, and we shouldn't barf of course... if width or height is <=0 we should bail out of plotting entirely (and early), and if the margins are too big to display anything... dunno what makes most sense here, either shrink the margins so we still have plotting space, or just display the title and bail?

@vdh

vdh commented Apr 16, 2018

Copy link
Copy Markdown
ContributorAuthor

I also discovered two additional places where rects are given negative widths for tiny charts (and added guards to the PR):

  • drawing.setRect / drawing.setSize in src/components/drawing/index.js
  • axes.makeClipPaths in src/plots/cartesian/axes.js

@etpinard@alexcjohnson
I know these guards don't directly address the code that generates the negative dimensions, but is it really so bad to guard against the generation of invalid SVG attributes? These DOM errors create a lot of noise in the console.

@etpinard

Copy link
Copy Markdown
Contributor

I also discovered two additional places where rects are given negative widths for tiny charts

Right. This is exactly why we're hoping to find the root cause of this problem.

Instead of patching every piece of code that might write negative svg width/height, we should (at least try to) make sure _length and other positive definite fields don't become negative in the first place.

@etpinard

etpinard commented Apr 16, 2018

Copy link
Copy Markdown
Contributor

... to do so, we'll need some sort of reproducible example in plotly.js.

@grahambryan

grahambryan commented May 1, 2018

Copy link
Copy Markdown

Has there been any resolution to this problem? I have been running into the same problem within react-plotly.js within my react app.

Error: attribute width: A negative value is not valid. ("-50") @ plotly.js:17171

@vdh

vdh commented May 2, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard

... to do so, we'll need some sort of reproducible example in plotly.js.

So are you implying that the CodePen examples I provided earlier are inadequate? Is there a better way to create an example? I apologise that I don't have the skills or familiarity with Plotly to separate react-plotly.js from the examples, but on Chrome 66.0.3359.139 I can reproduce the same console errors using those CodePens.

@etpinard

etpinard commented May 2, 2018

Copy link
Copy Markdown
Contributor

@vdh as far as I know no one has been able to reproduce this issue using only plotly.js (i.e. no react, no react-plotly.js). This doesn't mean plotly.js isn't doing something wrong here. But it would help you pin down why theses values are negative in the first place.

@etpinard

etpinard commented May 24, 2018

Copy link
Copy Markdown
Contributor

Ok. I was able to reproduce this bug in pure plotly.js.

See https://codepen.io/etpinard/pen/KRjKpg?editors=0010 and open the console to see the logs.

It seems to be a problem with Plots.resize (which is the plotly.js method called when react-plotly.js' useResizeHandler option is turned on).

Closing this PR and moving the discussion to #2663

@vdh
vdh deleted the patch-1 branch June 28, 2018 00:24
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.

5 participants

@vdh@etpinard@n-riesco@alexcjohnson@grahambryan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Prevent negative width or height on rect - #2482

Closed
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1
Closed

Prevent negative width or height on rect#2482
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1

Conversation

@vdh

@vdhvdh commented Mar 20, 2018

Copy link
Copy Markdown
Contributor

When working with responsive container sizes for charts, I've encountered Error: <rect> attribute height: A negative value is not valid. DOM errors (Chrome 65.0.3325.162). Because the container area is sometimes too small for a reasonable chart, the _length calculations sometimes go into the negatives.

This PR is just a simple guard to avoid setting invalid negative values on the rect elements.

Prevent "Error: <rect> attribute height: A negative value is not valid." DOM errors when very small chart sizes causes `_length` calculations to go into the negatives.
@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much for bringing this up! I'm not convinced your patch is the best way to fix this bug though. _length shouldn't be negative in the first place when reaching this part of the code.

Would you mind sharing a reproducible example that exhibits the DOM errors you're referring to?

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard
I was able to recreate it in CodePen ( https://codepen.io/vdh/pen/WzpOoe ), although it may be connected to react-plotly.js's useResizeHandler option (or the Plotly.Plots.resize call it wraps…?).

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

I've managed to make a smaller demo https://codepen.io/vdh/pen/OvpjmX
For some reason useResizeHandler / Plotly.Plots.resize is causing it, but I haven't been able to dig deeper yet as it would require reverse-engineering the code of react-plotly.js to recreate the Plotly calls.

@n-riesco

Copy link
Copy Markdown
Contributor

@vdh I see the same issue with react-chart-editor (see my comment here). In my case, an easy way to trigger this issue is to set display: none in the container node and trigger a resize.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

I'm assuming what's happening here is the margins are larger than the plot area - ie margin.l + margin.r > width, either because width is very small or we can't determine it at all (invisible node cc @n-riesco ). These situations are going to arise from time to time, and we shouldn't barf of course... if width or height is <=0 we should bail out of plotting entirely (and early), and if the margins are too big to display anything... dunno what makes most sense here, either shrink the margins so we still have plotting space, or just display the title and bail?

@vdh

vdh commented Apr 16, 2018

Copy link
Copy Markdown
ContributorAuthor

I also discovered two additional places where rects are given negative widths for tiny charts (and added guards to the PR):

  • drawing.setRect / drawing.setSize in src/components/drawing/index.js
  • axes.makeClipPaths in src/plots/cartesian/axes.js

@etpinard@alexcjohnson
I know these guards don't directly address the code that generates the negative dimensions, but is it really so bad to guard against the generation of invalid SVG attributes? These DOM errors create a lot of noise in the console.

@etpinard

Copy link
Copy Markdown
Contributor

I also discovered two additional places where rects are given negative widths for tiny charts

Right. This is exactly why we're hoping to find the root cause of this problem.

Instead of patching every piece of code that might write negative svg width/height, we should (at least try to) make sure _length and other positive definite fields don't become negative in the first place.

@etpinard

etpinard commented Apr 16, 2018

Copy link
Copy Markdown
Contributor

... to do so, we'll need some sort of reproducible example in plotly.js.

@grahambryan

grahambryan commented May 1, 2018

Copy link
Copy Markdown

Has there been any resolution to this problem? I have been running into the same problem within react-plotly.js within my react app.

Error: attribute width: A negative value is not valid. ("-50") @ plotly.js:17171

@vdh

vdh commented May 2, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard

... to do so, we'll need some sort of reproducible example in plotly.js.

So are you implying that the CodePen examples I provided earlier are inadequate? Is there a better way to create an example? I apologise that I don't have the skills or familiarity with Plotly to separate react-plotly.js from the examples, but on Chrome 66.0.3359.139 I can reproduce the same console errors using those CodePens.

@etpinard

etpinard commented May 2, 2018

Copy link
Copy Markdown
Contributor

@vdh as far as I know no one has been able to reproduce this issue using only plotly.js (i.e. no react, no react-plotly.js). This doesn't mean plotly.js isn't doing something wrong here. But it would help you pin down why theses values are negative in the first place.

@etpinard

etpinard commented May 24, 2018

Copy link
Copy Markdown
Contributor

Ok. I was able to reproduce this bug in pure plotly.js.

See https://codepen.io/etpinard/pen/KRjKpg?editors=0010 and open the console to see the logs.

It seems to be a problem with Plots.resize (which is the plotly.js method called when react-plotly.js' useResizeHandler option is turned on).

Closing this PR and moving the discussion to #2663

@vdh
vdh deleted the patch-1 branch June 28, 2018 00:24
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.

5 participants

@vdh@etpinard@n-riesco@alexcjohnson@grahambryan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Prevent negative width or height on rect - #2482

Closed
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1
Closed

Prevent negative width or height on rect#2482
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1

Conversation

@vdh

@vdhvdh commented Mar 20, 2018

Copy link
Copy Markdown
Contributor

When working with responsive container sizes for charts, I've encountered Error: <rect> attribute height: A negative value is not valid. DOM errors (Chrome 65.0.3325.162). Because the container area is sometimes too small for a reasonable chart, the _length calculations sometimes go into the negatives.

This PR is just a simple guard to avoid setting invalid negative values on the rect elements.

Prevent "Error: <rect> attribute height: A negative value is not valid." DOM errors when very small chart sizes causes `_length` calculations to go into the negatives.
@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much for bringing this up! I'm not convinced your patch is the best way to fix this bug though. _length shouldn't be negative in the first place when reaching this part of the code.

Would you mind sharing a reproducible example that exhibits the DOM errors you're referring to?

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard
I was able to recreate it in CodePen ( https://codepen.io/vdh/pen/WzpOoe ), although it may be connected to react-plotly.js's useResizeHandler option (or the Plotly.Plots.resize call it wraps…?).

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

I've managed to make a smaller demo https://codepen.io/vdh/pen/OvpjmX
For some reason useResizeHandler / Plotly.Plots.resize is causing it, but I haven't been able to dig deeper yet as it would require reverse-engineering the code of react-plotly.js to recreate the Plotly calls.

@n-riesco

Copy link
Copy Markdown
Contributor

@vdh I see the same issue with react-chart-editor (see my comment here). In my case, an easy way to trigger this issue is to set display: none in the container node and trigger a resize.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

I'm assuming what's happening here is the margins are larger than the plot area - ie margin.l + margin.r > width, either because width is very small or we can't determine it at all (invisible node cc @n-riesco ). These situations are going to arise from time to time, and we shouldn't barf of course... if width or height is <=0 we should bail out of plotting entirely (and early), and if the margins are too big to display anything... dunno what makes most sense here, either shrink the margins so we still have plotting space, or just display the title and bail?

@vdh

vdh commented Apr 16, 2018

Copy link
Copy Markdown
ContributorAuthor

I also discovered two additional places where rects are given negative widths for tiny charts (and added guards to the PR):

  • drawing.setRect / drawing.setSize in src/components/drawing/index.js
  • axes.makeClipPaths in src/plots/cartesian/axes.js

@etpinard@alexcjohnson
I know these guards don't directly address the code that generates the negative dimensions, but is it really so bad to guard against the generation of invalid SVG attributes? These DOM errors create a lot of noise in the console.

@etpinard

Copy link
Copy Markdown
Contributor

I also discovered two additional places where rects are given negative widths for tiny charts

Right. This is exactly why we're hoping to find the root cause of this problem.

Instead of patching every piece of code that might write negative svg width/height, we should (at least try to) make sure _length and other positive definite fields don't become negative in the first place.

@etpinard

etpinard commented Apr 16, 2018

Copy link
Copy Markdown
Contributor

... to do so, we'll need some sort of reproducible example in plotly.js.

@grahambryan

grahambryan commented May 1, 2018

Copy link
Copy Markdown

Has there been any resolution to this problem? I have been running into the same problem within react-plotly.js within my react app.

Error: attribute width: A negative value is not valid. ("-50") @ plotly.js:17171

@vdh

vdh commented May 2, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard

... to do so, we'll need some sort of reproducible example in plotly.js.

So are you implying that the CodePen examples I provided earlier are inadequate? Is there a better way to create an example? I apologise that I don't have the skills or familiarity with Plotly to separate react-plotly.js from the examples, but on Chrome 66.0.3359.139 I can reproduce the same console errors using those CodePens.

@etpinard

etpinard commented May 2, 2018

Copy link
Copy Markdown
Contributor

@vdh as far as I know no one has been able to reproduce this issue using only plotly.js (i.e. no react, no react-plotly.js). This doesn't mean plotly.js isn't doing something wrong here. But it would help you pin down why theses values are negative in the first place.

@etpinard

etpinard commented May 24, 2018

Copy link
Copy Markdown
Contributor

Ok. I was able to reproduce this bug in pure plotly.js.

See https://codepen.io/etpinard/pen/KRjKpg?editors=0010 and open the console to see the logs.

It seems to be a problem with Plots.resize (which is the plotly.js method called when react-plotly.js' useResizeHandler option is turned on).

Closing this PR and moving the discussion to #2663

@vdh
vdh deleted the patch-1 branch June 28, 2018 00:24
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.

5 participants

@vdh@etpinard@n-riesco@alexcjohnson@grahambryan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Prevent negative width or height on rect - #2482

Closed
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1
Closed

Prevent negative width or height on rect#2482
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1

Conversation

@vdh

@vdhvdh commented Mar 20, 2018

Copy link
Copy Markdown
Contributor

When working with responsive container sizes for charts, I've encountered Error: <rect> attribute height: A negative value is not valid. DOM errors (Chrome 65.0.3325.162). Because the container area is sometimes too small for a reasonable chart, the _length calculations sometimes go into the negatives.

This PR is just a simple guard to avoid setting invalid negative values on the rect elements.

Prevent "Error: <rect> attribute height: A negative value is not valid." DOM errors when very small chart sizes causes `_length` calculations to go into the negatives.
@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much for bringing this up! I'm not convinced your patch is the best way to fix this bug though. _length shouldn't be negative in the first place when reaching this part of the code.

Would you mind sharing a reproducible example that exhibits the DOM errors you're referring to?

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard
I was able to recreate it in CodePen ( https://codepen.io/vdh/pen/WzpOoe ), although it may be connected to react-plotly.js's useResizeHandler option (or the Plotly.Plots.resize call it wraps…?).

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

I've managed to make a smaller demo https://codepen.io/vdh/pen/OvpjmX
For some reason useResizeHandler / Plotly.Plots.resize is causing it, but I haven't been able to dig deeper yet as it would require reverse-engineering the code of react-plotly.js to recreate the Plotly calls.

@n-riesco

Copy link
Copy Markdown
Contributor

@vdh I see the same issue with react-chart-editor (see my comment here). In my case, an easy way to trigger this issue is to set display: none in the container node and trigger a resize.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

I'm assuming what's happening here is the margins are larger than the plot area - ie margin.l + margin.r > width, either because width is very small or we can't determine it at all (invisible node cc @n-riesco ). These situations are going to arise from time to time, and we shouldn't barf of course... if width or height is <=0 we should bail out of plotting entirely (and early), and if the margins are too big to display anything... dunno what makes most sense here, either shrink the margins so we still have plotting space, or just display the title and bail?

@vdh

vdh commented Apr 16, 2018

Copy link
Copy Markdown
ContributorAuthor

I also discovered two additional places where rects are given negative widths for tiny charts (and added guards to the PR):

  • drawing.setRect / drawing.setSize in src/components/drawing/index.js
  • axes.makeClipPaths in src/plots/cartesian/axes.js

@etpinard@alexcjohnson
I know these guards don't directly address the code that generates the negative dimensions, but is it really so bad to guard against the generation of invalid SVG attributes? These DOM errors create a lot of noise in the console.

@etpinard

Copy link
Copy Markdown
Contributor

I also discovered two additional places where rects are given negative widths for tiny charts

Right. This is exactly why we're hoping to find the root cause of this problem.

Instead of patching every piece of code that might write negative svg width/height, we should (at least try to) make sure _length and other positive definite fields don't become negative in the first place.

@etpinard

etpinard commented Apr 16, 2018

Copy link
Copy Markdown
Contributor

... to do so, we'll need some sort of reproducible example in plotly.js.

@grahambryan

grahambryan commented May 1, 2018

Copy link
Copy Markdown

Has there been any resolution to this problem? I have been running into the same problem within react-plotly.js within my react app.

Error: attribute width: A negative value is not valid. ("-50") @ plotly.js:17171

@vdh

vdh commented May 2, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard

... to do so, we'll need some sort of reproducible example in plotly.js.

So are you implying that the CodePen examples I provided earlier are inadequate? Is there a better way to create an example? I apologise that I don't have the skills or familiarity with Plotly to separate react-plotly.js from the examples, but on Chrome 66.0.3359.139 I can reproduce the same console errors using those CodePens.

@etpinard

etpinard commented May 2, 2018

Copy link
Copy Markdown
Contributor

@vdh as far as I know no one has been able to reproduce this issue using only plotly.js (i.e. no react, no react-plotly.js). This doesn't mean plotly.js isn't doing something wrong here. But it would help you pin down why theses values are negative in the first place.

@etpinard

etpinard commented May 24, 2018

Copy link
Copy Markdown
Contributor

Ok. I was able to reproduce this bug in pure plotly.js.

See https://codepen.io/etpinard/pen/KRjKpg?editors=0010 and open the console to see the logs.

It seems to be a problem with Plots.resize (which is the plotly.js method called when react-plotly.js' useResizeHandler option is turned on).

Closing this PR and moving the discussion to #2663

@vdh
vdh deleted the patch-1 branch June 28, 2018 00:24
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.

5 participants

@vdh@etpinard@n-riesco@alexcjohnson@grahambryan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Prevent negative width or height on rect - #2482

Closed
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1
Closed

Prevent negative width or height on rect#2482
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1

Conversation

@vdh

@vdhvdh commented Mar 20, 2018

Copy link
Copy Markdown
Contributor

When working with responsive container sizes for charts, I've encountered Error: <rect> attribute height: A negative value is not valid. DOM errors (Chrome 65.0.3325.162). Because the container area is sometimes too small for a reasonable chart, the _length calculations sometimes go into the negatives.

This PR is just a simple guard to avoid setting invalid negative values on the rect elements.

Prevent "Error: <rect> attribute height: A negative value is not valid." DOM errors when very small chart sizes causes `_length` calculations to go into the negatives.
@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much for bringing this up! I'm not convinced your patch is the best way to fix this bug though. _length shouldn't be negative in the first place when reaching this part of the code.

Would you mind sharing a reproducible example that exhibits the DOM errors you're referring to?

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard
I was able to recreate it in CodePen ( https://codepen.io/vdh/pen/WzpOoe ), although it may be connected to react-plotly.js's useResizeHandler option (or the Plotly.Plots.resize call it wraps…?).

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

I've managed to make a smaller demo https://codepen.io/vdh/pen/OvpjmX
For some reason useResizeHandler / Plotly.Plots.resize is causing it, but I haven't been able to dig deeper yet as it would require reverse-engineering the code of react-plotly.js to recreate the Plotly calls.

@n-riesco

Copy link
Copy Markdown
Contributor

@vdh I see the same issue with react-chart-editor (see my comment here). In my case, an easy way to trigger this issue is to set display: none in the container node and trigger a resize.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

I'm assuming what's happening here is the margins are larger than the plot area - ie margin.l + margin.r > width, either because width is very small or we can't determine it at all (invisible node cc @n-riesco ). These situations are going to arise from time to time, and we shouldn't barf of course... if width or height is <=0 we should bail out of plotting entirely (and early), and if the margins are too big to display anything... dunno what makes most sense here, either shrink the margins so we still have plotting space, or just display the title and bail?

@vdh

vdh commented Apr 16, 2018

Copy link
Copy Markdown
ContributorAuthor

I also discovered two additional places where rects are given negative widths for tiny charts (and added guards to the PR):

  • drawing.setRect / drawing.setSize in src/components/drawing/index.js
  • axes.makeClipPaths in src/plots/cartesian/axes.js

@etpinard@alexcjohnson
I know these guards don't directly address the code that generates the negative dimensions, but is it really so bad to guard against the generation of invalid SVG attributes? These DOM errors create a lot of noise in the console.

@etpinard

Copy link
Copy Markdown
Contributor

I also discovered two additional places where rects are given negative widths for tiny charts

Right. This is exactly why we're hoping to find the root cause of this problem.

Instead of patching every piece of code that might write negative svg width/height, we should (at least try to) make sure _length and other positive definite fields don't become negative in the first place.

@etpinard

etpinard commented Apr 16, 2018

Copy link
Copy Markdown
Contributor

... to do so, we'll need some sort of reproducible example in plotly.js.

@grahambryan

grahambryan commented May 1, 2018

Copy link
Copy Markdown

Has there been any resolution to this problem? I have been running into the same problem within react-plotly.js within my react app.

Error: attribute width: A negative value is not valid. ("-50") @ plotly.js:17171

@vdh

vdh commented May 2, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard

... to do so, we'll need some sort of reproducible example in plotly.js.

So are you implying that the CodePen examples I provided earlier are inadequate? Is there a better way to create an example? I apologise that I don't have the skills or familiarity with Plotly to separate react-plotly.js from the examples, but on Chrome 66.0.3359.139 I can reproduce the same console errors using those CodePens.

@etpinard

etpinard commented May 2, 2018

Copy link
Copy Markdown
Contributor

@vdh as far as I know no one has been able to reproduce this issue using only plotly.js (i.e. no react, no react-plotly.js). This doesn't mean plotly.js isn't doing something wrong here. But it would help you pin down why theses values are negative in the first place.

@etpinard

etpinard commented May 24, 2018

Copy link
Copy Markdown
Contributor

Ok. I was able to reproduce this bug in pure plotly.js.

See https://codepen.io/etpinard/pen/KRjKpg?editors=0010 and open the console to see the logs.

It seems to be a problem with Plots.resize (which is the plotly.js method called when react-plotly.js' useResizeHandler option is turned on).

Closing this PR and moving the discussion to #2663

@vdh
vdh deleted the patch-1 branch June 28, 2018 00:24
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.

5 participants

@vdh@etpinard@n-riesco@alexcjohnson@grahambryan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Prevent negative width or height on rect - #2482

Closed
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1
Closed

Prevent negative width or height on rect#2482
vdh wants to merge 3 commits into
plotly:masterfrom
vdh:patch-1

Conversation

@vdh

@vdhvdh commented Mar 20, 2018

Copy link
Copy Markdown
Contributor

When working with responsive container sizes for charts, I've encountered Error: <rect> attribute height: A negative value is not valid. DOM errors (Chrome 65.0.3325.162). Because the container area is sometimes too small for a reasonable chart, the _length calculations sometimes go into the negatives.

This PR is just a simple guard to avoid setting invalid negative values on the rect elements.

Prevent "Error: <rect> attribute height: A negative value is not valid." DOM errors when very small chart sizes causes `_length` calculations to go into the negatives.
@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much for bringing this up! I'm not convinced your patch is the best way to fix this bug though. _length shouldn't be negative in the first place when reaching this part of the code.

Would you mind sharing a reproducible example that exhibits the DOM errors you're referring to?

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard
I was able to recreate it in CodePen ( https://codepen.io/vdh/pen/WzpOoe ), although it may be connected to react-plotly.js's useResizeHandler option (or the Plotly.Plots.resize call it wraps…?).

@vdh

vdh commented Mar 21, 2018

Copy link
Copy Markdown
ContributorAuthor

I've managed to make a smaller demo https://codepen.io/vdh/pen/OvpjmX
For some reason useResizeHandler / Plotly.Plots.resize is causing it, but I haven't been able to dig deeper yet as it would require reverse-engineering the code of react-plotly.js to recreate the Plotly calls.

@n-riesco

Copy link
Copy Markdown
Contributor

@vdh I see the same issue with react-chart-editor (see my comment here). In my case, an easy way to trigger this issue is to set display: none in the container node and trigger a resize.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

I'm assuming what's happening here is the margins are larger than the plot area - ie margin.l + margin.r > width, either because width is very small or we can't determine it at all (invisible node cc @n-riesco ). These situations are going to arise from time to time, and we shouldn't barf of course... if width or height is <=0 we should bail out of plotting entirely (and early), and if the margins are too big to display anything... dunno what makes most sense here, either shrink the margins so we still have plotting space, or just display the title and bail?

@vdh

vdh commented Apr 16, 2018

Copy link
Copy Markdown
ContributorAuthor

I also discovered two additional places where rects are given negative widths for tiny charts (and added guards to the PR):

  • drawing.setRect / drawing.setSize in src/components/drawing/index.js
  • axes.makeClipPaths in src/plots/cartesian/axes.js

@etpinard@alexcjohnson
I know these guards don't directly address the code that generates the negative dimensions, but is it really so bad to guard against the generation of invalid SVG attributes? These DOM errors create a lot of noise in the console.

@etpinard

Copy link
Copy Markdown
Contributor

I also discovered two additional places where rects are given negative widths for tiny charts

Right. This is exactly why we're hoping to find the root cause of this problem.

Instead of patching every piece of code that might write negative svg width/height, we should (at least try to) make sure _length and other positive definite fields don't become negative in the first place.

@etpinard

etpinard commented Apr 16, 2018

Copy link
Copy Markdown
Contributor

... to do so, we'll need some sort of reproducible example in plotly.js.

@grahambryan

grahambryan commented May 1, 2018

Copy link
Copy Markdown

Has there been any resolution to this problem? I have been running into the same problem within react-plotly.js within my react app.

Error: attribute width: A negative value is not valid. ("-50") @ plotly.js:17171

@vdh

vdh commented May 2, 2018

Copy link
Copy Markdown
ContributorAuthor

@etpinard

... to do so, we'll need some sort of reproducible example in plotly.js.

So are you implying that the CodePen examples I provided earlier are inadequate? Is there a better way to create an example? I apologise that I don't have the skills or familiarity with Plotly to separate react-plotly.js from the examples, but on Chrome 66.0.3359.139 I can reproduce the same console errors using those CodePens.

@etpinard

etpinard commented May 2, 2018

Copy link
Copy Markdown
Contributor

@vdh as far as I know no one has been able to reproduce this issue using only plotly.js (i.e. no react, no react-plotly.js). This doesn't mean plotly.js isn't doing something wrong here. But it would help you pin down why theses values are negative in the first place.

@etpinard

etpinard commented May 24, 2018

Copy link
Copy Markdown
Contributor

Ok. I was able to reproduce this bug in pure plotly.js.

See https://codepen.io/etpinard/pen/KRjKpg?editors=0010 and open the console to see the logs.

It seems to be a problem with Plots.resize (which is the plotly.js method called when react-plotly.js' useResizeHandler option is turned on).

Closing this PR and moving the discussion to #2663

@vdh
vdh deleted the patch-1 branch June 28, 2018 00:24
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.

5 participants

@vdh@etpinard@n-riesco@alexcjohnson@grahambryan