Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iframe height sometimes sets to zero on initial page load #629

Closed
ghost opened this issue Sep 14, 2018 · 18 comments
Closed

iframe height sometimes sets to zero on initial page load #629

ghost opened this issue Sep 14, 2018 · 18 comments

Comments

@ghost
Copy link

ghost commented Sep 14, 2018

Version: 3.5.15

Sometimes when the parent page is loaded, the height of the iframe is set to 0. Clicking on the page or switching tabs will re-trigger the calculation and set the height correctly.

I cannot reproduce this issue consistently. I simply mash the refresh button and it will eventually trigger.

iFrameResize configuration:

inPageLinks: false,
heightCalculationMethod: 'max',
minHeight: 0,
checkOrigin: true

Log from a load with the iframe sized correctly:

a.js:8 [iFrameSizer][Host page: iFrameResizer0] Added missing iframe ID: iFrameResizer0 (https://sub.example.net/frame)
a.js:8 [iFrameSizer][Host page: iFrameResizer0] IFrame scrolling disabled for iFrameResizer0
a.js:8 [iFrameSizer][Host page: iFrameResizer0] [init] Sending msg to iframe[iFrameResizer0] (iFrameResizer0:8:false:true:32:true:true:null:max:null:null:0:false:parent:scroll) targetOrigin: https://sub.example.net
a.js:8 [iFrameSizer][Host page: null] Ignored: permission_denied
a.js:8 [iFrameSizer][Host page: iFrameResizer0] [iFrame requested init] Sending msg to iframe[iFrameResizer0] (iFrameResizer0:8:false:true:32:true:true:null:max:null:null:0:false:parent:scroll) targetOrigin: https://sub.example.net
b.js:9 [iFrameSizer][iFrameResizer0] Initialising iFrame (https://sub.example.net/frame)
b.js:9 [iFrameSizer][iFrameResizer0] Reading data from page: {"targetOrigin":"https://sub.example.net"}
b.js:9 [iFrameSizer][iFrameResizer0] TargetOrigin for parent set to: https://sub.example.net
b.js:9 [iFrameSizer][iFrameResizer0] height calculation method set to "max"
b.js:9 [iFrameSizer][iFrameResizer0] HTML & body height set to "auto"
b.js:9 [iFrameSizer][iFrameResizer0] Enable public methods
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Animation Start
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Animation Iteration
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Animation End
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Input
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Mouse Up
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Mouse Down
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Orientation Change
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Print
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Ready State Change
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Touch Start
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Touch End
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Touch Cancel
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Transition Start
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Transition Iteration
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Transition End
b.js:9 [iFrameSizer][iFrameResizer0] Create body MutationObserver
b.js:9 [iFrameSizer][iFrameResizer0] In page linking not enabled
b.js:9 [iFrameSizer][iFrameResizer0] Trigger event lock on
b.js:9 [iFrameSizer][iFrameResizer0] Sending message to host page (iFrameResizer0:560:844:init)
a.js:8 [iFrameSizer][Host page: iFrameResizer0] [iFrame.onload] Sending msg to iframe[iFrameResizer0] (iFrameResizer0:8:false:true:32:true:true:null:max:null:null:0:false:parent:scroll) targetOrigin: https://sub.example.net
a.js:8 [iFrameSizer][Host page: iFrameResizer0] Received: [iFrameSizer]iFrameResizer0:560:844:init
a.js:8 [iFrameSizer][Host page: iFrameResizer0] Checking connection is from: https://sub.example.net
a.js:8 [iFrameSizer][Host page: iFrameResizer0] Checking height is in range 0-Infinity
a.js:8 [iFrameSizer][Host page: iFrameResizer0] Checking width is in range 0-Infinity
a.js:8 [iFrameSizer][Host page: iFrameResizer0] IFrame (iFrameResizer0) height set to 560px
b.js:9 [iFrameSizer][iFrameResizer0] Trigger event lock off
b.js:9 [iFrameSizer][iFrameResizer0] --

Log from a load with the iframe sized incorrectly:

a.js:8 [iFrameSizer][Host page: iFrameResizer0] Added missing iframe ID: iFrameResizer0 (https://sub.example.net/frame)
a.js:8 [iFrameSizer][Host page: iFrameResizer0] IFrame scrolling disabled for iFrameResizer0
a.js:8 [iFrameSizer][Host page: iFrameResizer0] [init] Sending msg to iframe[iFrameResizer0] (iFrameResizer0:8:false:true:32:true:true:null:max:null:null:0:false:parent:scroll) targetOrigin: https://sub.example.net
a.js:8 [iFrameSizer][Host page: null] Ignored: permission_denied
a.js:8 [iFrameSizer][Host page: iFrameResizer0] [iFrame requested init] Sending msg to iframe[iFrameResizer0] (iFrameResizer0:8:false:true:32:true:true:null:max:null:null:0:false:parent:scroll) targetOrigin: https://sub.example.net
b.js:9 [iFrameSizer][iFrameResizer0] Initialising iFrame (https://sub.example.net/frame)
b.js:9 [iFrameSizer][iFrameResizer0] Reading data from page: {"targetOrigin":"https://sub.example.net"}
b.js:9 [iFrameSizer][iFrameResizer0] TargetOrigin for parent set to: https://sub.example.net
b.js:9 [iFrameSizer][iFrameResizer0] height calculation method set to "max"
b.js:9 [iFrameSizer][iFrameResizer0] HTML & body height set to "auto"
b.js:9 [iFrameSizer][iFrameResizer0] Enable public methods
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Animation Start
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Animation Iteration
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Animation End
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Input
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Mouse Up
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Mouse Down
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Orientation Change
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Print
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Ready State Change
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Touch Start
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Touch End
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Touch Cancel
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Transition Start
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Transition Iteration
b.js:9 [iFrameSizer][iFrameResizer0] Add event listener: Transition End
b.js:9 [iFrameSizer][iFrameResizer0] Create body MutationObserver
b.js:9 [iFrameSizer][iFrameResizer0] In page linking not enabled
b.js:9 [iFrameSizer][iFrameResizer0] Trigger event lock on
b.js:9 [iFrameSizer][iFrameResizer0] Sending message to host page (iFrameResizer0:560:844:init)
a.js:8 [iFrameSizer][Host page: iFrameResizer0] Received: [iFrameSizer]iFrameResizer0:560:844:init
a.js:8 [iFrameSizer][Host page: iFrameResizer0] Checking connection is from: https://sub.example.net
a.js:8 [iFrameSizer][Host page: iFrameResizer0] Checking height is in range 0-Infinity
a.js:8 [iFrameSizer][Host page: iFrameResizer0] Checking width is in range 0-Infinity
a.js:8 [iFrameSizer][Host page: iFrameResizer0] IFrame (iFrameResizer0) height set to 560px
a.js:8 [iFrameSizer][Host page: iFrameResizer0] [iFrame.onload] Sending msg to iframe[iFrameResizer0] (iFrameResizer0:8:false:true:32:true:true:null:max:null:null:0:false:parent:scroll) targetOrigin: https://sub.example.net
a.js:8 [iFrameSizer][Host page: undefined] Size reset requested by host page
a.js:8 [iFrameSizer][Host page: undefined] Get page position: 0,212
a.js:8 [iFrameSizer][Host page: undefined] Requesting animation frame
a.js:8 [iFrameSizer][Host page: undefined] IFrame (iFrameResizer0) height set to 0px
a.js:8 [iFrameSizer][Host page: iFrameResizer0] [reset] Sending msg to iframe[iFrameResizer0] (reset) targetOrigin: https://sub.example.net
b.js:9 [iFrameSizer][iFrameResizer0] Page reset ignored by init
b.js:9 [iFrameSizer][iFrameResizer0] Trigger event lock off
b.js:9 [iFrameSizer][iFrameResizer0] --
@davidjbradshaw
Copy link
Owner

Try setting minHeight to 1. Does that make a difference?

@ghost
Copy link
Author

ghost commented Sep 17, 2018

@davidjbradshaw It did not; I was still able to trigger the bug with minHeight set to 1.

@davidjbradshaw
Copy link
Owner

davidjbradshaw commented Sep 17, 2018

Is this only happening in IE? And if so what version?

@davidjbradshaw
Copy link
Owner

Looking at the code. Try changing checkReset() so the if statement looks like this and let me know if it fixes it.

if (!firstRun && resetRequertMethod && iframe) {
  resetIFrame({iframe:iframe, height:0, width:0, type:'init'});
}

@ghost
Copy link
Author

ghost commented Sep 17, 2018

Using Chromium 68.0.3440.106; not IE.

Making that change does not fix the issue.

@davidjbradshaw
Copy link
Owner

Very strange and I'm a bit out of ideas. If you use a different resize method that would help.

@ghost
Copy link
Author

ghost commented Sep 17, 2018

Thanks, @davidjbradshaw. I switched back to the default heightCalculationMethod and it's working without issue.

You can close this issue if you think there's no reason to dig into this further.

@ddxdental
Copy link
Contributor

@bontibon @davidjbradshaw , we had to revert to heightCalculationMethod: 'max' because it was cutting off many iframes. max is still sometimes setting the iframe height to zero, which is better than always having pages cut.

Doing some debugging, and struggling to figure out why messageData is being set as follows:

{iframe: iframe#iFrameResizer0.addon-iframe, height: 0, width: 0, type: "init"}

note the missing id attribute. With logging turned on, you can see that the resetPage an event is received setting messageData to:

{iframe: iframe#iFrameResizer0.addon-iframe, id: "iFrameResizer0", height: "560", width: "1400", type: "resetPage"}
[iFrameSizer][Host page: iFrameResizer0] Received: [iFrameSizer]iFrameResizer0:560:1400:resetPage
a.js:132 [iFrameSizer][Host page: iFrameResizer0] Checking connection is from: https://mylab.labnextlaptop.net
a.js:132 [iFrameSizer][Host page: iFrameResizer0] Checking height is in range 0-Infinity
a.js:132 [iFrameSizer][Host page: iFrameResizer0] Checking width is in range 0-Infinity
a.js:132 [iFrameSizer][Host page: iFrameResizer0] Requesting animation frame
a.js:132 [iFrameSizer][Host page: iFrameResizer0] IFrame (iFrameResizer0) height set to 560px
a.js:132 [iFrameSizer][Host page: iFrameResizer0] Set page position: 0,0
VM8879 addon.js:165 [iFrameSizer][iFrameResizer0] Trigger event lock off
VM8879 addon.js:165 [iFrameSizer][iFrameResizer0] --
a.js:132 [iFrameSizer][Host page: iFrameResizer0] [iFrame.onload] Sending msg to iframe[iFrameResizer0] (iFrameResizer0:8:false:true:32:true:true:null:max:null:null:0:false:parent:scroll) targetOrigin: https://mylab.labnextlaptop.net
a.js:132 [iFrameSizer][Host page: undefined] Size reset requested by host page
a.js:132 [iFrameSizer][Host page: undefined] Get page position: 0,0
a.js:132 [iFrameSizer][Host page: undefined] Requesting animation frame
[iFrameSizer][Host page: undefined] IFrame (iFrameResizer0) height set to 0px
a.js:132 [iFrameSizer][Host page: iFrameResizer0] [reset] Sending msg to iframe[iFrameResizer0] (reset) targetOrigin: https://mylab.labnextlaptop.net

But then you can see we get to a point where messageData is set to

{iframe: iframe#iFrameResizer0.addon-iframe, height: 0, width: 0, type: "init"}

However no new event was raised.

For that matter, throughout the entire lifespan, messageData (which looks to me to only be set once here: https://github.com/davidjbradshaw/iframe-resizer/blob/master/src/iframeResizer.js#L510) is never set to an object missing the id attribute:

0: {iframe: iframe#iFrameResizer0.addon-iframe, id: "iFrameResizer0", height: "560", width: "1400", type: "init"}
1: {iframe: iframe#iFrameResizer0.addon-iframe, id: "iFrameResizer0", height: "560", width: "1400", type: "reset"}
2: {iframe: iframe#iFrameResizer0.addon-iframe, id: "iFrameResizer0", height: "560", width: "1400", type: "resetPage"}
3: {iframe: iframe#iFrameResizer0.addon-iframe, id: "iFrameResizer0", height: "560", width: "1400", type: "reset"}
4: {iframe: iframe#iFrameResizer0.addon-iframe, id: "iFrameResizer0", height: "560", width: "1400", type: "resetPage"}

@davidjbradshaw can you point out anywhere in the code where messageData might have id unset? I'm just not seeing it.

@ddxdental
Copy link
Contributor

This doesn't seem like the right solution, but skipping settings dimension when messageData.id is absent, solves the problem.

function setDimension(dimension) {
    if (!messageData.id) {
        log(
            'undefined',
            'messageData id not set'
        );
        return;
    }
    messageData.iframe.style[dimension] = messageData[dimension] + 'px';
    log(
        messageData.id,
        'IFrame (' + iframeId +
        ') ' + dimension +
        ' set to ' + messageData[dimension] + 'px'
    );
}

@davidjbradshaw
Copy link
Owner

That's very strange, do you want to make a PR for that? Testing for the error is better then having this problem, even if it is not a full solution

@BobStein
Copy link

I'm getting this now with widthCalculationMethod: 'taggedElement' in Chrome, Firefox and Edge (but not in IE11).

Sometimes it works:
iframe_good_size

Sometimes it doesn't (see the tiny black square):
iframe_zero_size

Resizing the window makes the iframe correct its size.

The site is https://unslumping.org/?cont=994 and the HTML inside the iframe is:

<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://cdn.jsdelivr.net/npm/iframe-resizer@4.1.1/js/iframeResizer.contentWindow.js">
</script>
<style>
    body { margin: 0; }
    img { display: block; }
</style>
</head>
<body style="margin:0" data-oembed-domain="www.instagram.com">
<a style="border:0" href="https://www.instagram.com/p/BNCeThsAhVT/" target="_blank">
<img src="https://instagram.com/p/BNCeThsAhVT/media/?size=t" data-iframe-width="300">
</a>
</body>
</html>

It's intermittent, but I seem to get the zero-size-iframe situation a lot when I reload the page multiple times. Almost as if it were MORE likely when the iframe contents are in the cache.

@rohan5894
Copy link

I am facing the exactly same issue. It doesn't resize correctly sometimes on page load, though clicking on the iframe content resize it correctly again. Did anyone found a solution?

@rohan5894
Copy link

I think this is happening when the iframe container is hidden. The resizer returns 0px when the iframe is hidden. Check the following link and look into console
http://dev.axtrics.com/Aframark/public/index.html

@davidjbradshaw
Copy link
Owner

davidjbradshaw commented Sep 17, 2019 via email

@rohan5894
Copy link

@davidjbradshaw Do you think is there any way we can get the correct height of the iframe even if the parent container is hidden?

@rohan5894
Copy link

I can see this message in log "Hidden iFrame detected, creating visibility listener". It means the script is detecting the hidden iframe but visibility listener is not working.

@davidjbradshaw
Copy link
Owner

This should be fixed as of v4.2.3, thanks to PR #768

@hbcondo
Copy link

hbcondo commented Mar 24, 2020

I came across this issue when placing the iframe in a bootstrap tab that wasn't active. When the user clicked on the tab that contained the iframe, the iframe content would not display in full and the logs showed iframe-resizer was setting the height at only 16px. To resolve this, I called the resize method in a tab onclick event handler. That got the iframe to render its size based on its content.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants