Bug 149889 - Wrong viewport in iframes
Summary: Wrong viewport in iframes
Status: NEW
Alias: None
Product: WebKit
Classification: Unclassified
Component: DOM (show other bugs)
Version: Safari 9
Hardware: iPhone / iPad iOS 9.0
: P2 Normal
Assignee: Nobody
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-10-07 13:09 PDT by Aleksandr Dobkin
Modified: 2023-12-11 16:48 PST (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Aleksandr Dobkin 2015-10-07 13:09:10 PDT
When a page is embedded in an iframe, the viewport expands to the size of the iframe, which causes some pages to render in Desktop mode instead of Mobile.

For example, the following page always renders in 'MOBILE' mode on e.g. Mobile Safari on iPhones.

  <!DOCTYPE html>
  <head>
    <meta content="width=device-width" name="viewport">
    <style>
      body::after {
        content: "DESKTOP"
      }
      @media (max-width:767px) {
        body::after {
          content: "MOBILE"
        }
      }
    </style>
  </head>
  <div style="width: 1000px; border: 1px solid blue;">
    very wide element
  </div>

See this in action at http://output.jsbin.com/tizisoxidu. However, when the same page is embedded in an iframe, it renders in 'DESKTOP' mode:

  <!DOCTYPE html>
  <head>
    <meta content="width=device-width" name="viewport">
  </head>
  <iframe src="//output.jsbin.com/tizisoxidu"></iframe>


See this at http://output.jsbin.com/qagelujucu.
Comment 1 Simon Fraser (smfr) 2015-10-07 19:59:04 PDT
> the viewport expands to the size of the iframe
This is frame flattening, which we do by default on iOS. We also don't do anything with <meta name="viewport"> tags in iframes.
Comment 2 Aleksandr Dobkin 2015-10-08 15:23:37 PDT
Note that in the top-level/parent frame, the viewport width never changes. So even if the size of the content, including interior iframes, becomes very large, the viewport remains at e.g. 320px and mobile rendering is maintained. However, once the content is put into an iframe, it ends up rendering much differently depending on the CSS rules that are used.

One idea to fix this while keeping flattening would be make the CSS viewport size in frames to equal the nominal size of the frame. For example, if the iframe width is specified to be '100px', '100vw', or '100%', the viewport would be fixed to the corresponding pixel sizes, at least for the purpose of CSS media queries.

This is pretty difficult to work around currently. I'm not aware of any way to to disable flattening for a particular frame. The only reasonable workaround I'm aware of is either 1) to create scrolling element and put the extra-wide content inside it, but that requires changing the DOM of the iframe, or 2) disable horizontal scrolling, but this really not ideal.