Closed Bug 156388 Opened 22 years ago Closed 21 years ago

Implement document.documentElement.clientWidth and document.documentElement.clientHeight

Categories

(Core :: DOM: Core & HTML, defect)

x86
All
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: bugzilla, Unassigned)

References

Details

(Keywords: testcase)

Attachments

(2 files)

This bug is the cousin of bug 62536. The purpose here is to implement
document.documentElement.clientWidth/clientHeight DHTML properties within Moz
exactly the way it works within MSIE 6 in standards compliant mode. Solving this
bug, I feel, would eliminate all the problems and frustations related to precise
and accurate layout of web sites where knowing exactly the dimensions of the
client area (also known, referred as content area) and the dimensions of the
browser viewport are decisive.

I believe bug 140308 and bug 48634 as re-summarized (and maybe bug 72540, bug
76197) to be very much related to the implementation of
document.documentElement.clientHeight/Width. People in bug 140308 and bug 48634
want the window.innerWidth and window.innerHeight properties to "behave" like
MSIE's document.documentElement.clientWidth/Height properties.

Right now, the latest nightly build of Mozilla returns 0 for these properties.

A test case follows.
** You must use MSIE 6 in order to view this test case **
There is no other way to illustrate how MSIE 6 renders these properties in
"CSS1Compat" mode.
Instructions:
Using a high video screen resolution is better, preferable.
The moving lines (red, blue, purple ones) purpose is to illustrate how
absolutely positioned elements when positioned outside the client area cause
the root element to be streched, cause the dimensions of the root elements to
be increased and cause the appearance of scrollbars. (Another specific test
case might be needed to better achieve this.) Absolutely positioned elements
are taken out of normal flow and are positioned outside the body element in the
html element.
One final note: MSIE 6 does not render margins for the html element, does not
display margins for the html element but Mozilla-based browsers do.
Additional comments on the test case.
Move the mouse to the far right, beyond the lime border and/or move the mouse to
the bottom beyond the lime border. This will create scrollbars and the values of
document.documentElement.clientWidth/Height will be updated in real time. This
is the behavior that many people "expect" or demand (bug 140308, bug 48634) from
window.innerHeight/Width properties. Window.innerHeight/Width are totally
different properties measuring something else. 
To the right component.
Assignee: joki → jst
Component: DOM Events → DOM Mozilla Extensions
QA Contact: vladimire → lchiang
Blocks: 125419
Status: UNCONFIRMED → NEW
Ever confirmed: true
QA Contact: lchiang → ian
That this does not work really amazes me. Why is it that clientWidth works for
any element but the root element? Is it possible that the root element has a
different type of ScrollView than other scrollable elements? Most likely yes,
and since clientWidth uses the scrollView.clipView.bounds something is going
wrong here.

(Sorry I could not get that deep into the code to actually find the problem but
I think I at least got a bit closer to finding the reason for the bug.)
No longer blocks: 125419
"Is it possible that the root element has a
different type of ScrollView"

It is possible that I don't know what this means, but I'll make a stab in the
dark. HTML{ overflow: auto; } causes scrollbars to disappear. Does this mean
anything?

If you try it with javascript on a loaded document, scrollbars remain but disappear.

Try it:
javascript:void(document.documentElement.style.overflow='auto');

Is there a dependency? I think this may be related to bug 54661
Re comment #4 and #5:
Try the following page with MSIE 6 for windows, Mozilla, etc... and you'll see
differences (but these values are constant for each browser and each rendering
mode) in the margins applied to the body, to the overflow (and overflow-y)
values of both the body and html elements, even a default border on the html
element for MSIE 6, etc.etc. I just added css width and css height a few min. ago.

http://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/BrowsersDefaultValues.html

Also, please try the attachment 90581 [details] in this bugfile if you have MSIE 6 for
windows: I think it is revealing, empirically demonstrating some of the hidden
default browser values of the html and body elements.
clientHeight Property
Internet Development Index

Retrieves the height of the object including padding, but not including margin,
border, or scroll bar. 
---------------------------

documentElement.clientHeight may be higher than window.innerHeight. 
documentElement.clientHeight may be lower than window.innerHeight. 

1) documentElement.clientHeight will be higher than window.innerHeight when the
html element has height: auto. What you really want is the offsetHeight of the
ICB, which is really window.innerHeight - vScrollbarWidth. 

2) documentElement.clientHeight will be lower than window.innerHeight when the
html element has borders.

3) documentElement.clientHeight will be lower than window.innerHeight when the
html element has a height property that is less than the window's innerHeight.



In statement 1, the initial containing block has the scrollbar. the height of
the html element is unchanged. it may be higher than the ICB containing it. The
ICB has a default scrolling mechanism that is provided automatically by the browser.

In statement 2, borders are not included in the clientHeight property. If the
offsetHeight of the root (html) has borders, it's clientHeight must be less than
the innerWidth.

In statement 3, If the offsetHeight of the root (html) is less than the height
of the viewport, then the clientHeight property will be less than
window.innerWidth. There currently is a bug in mozilla, bug 15405, that prevents
html from being less than the viewport's height, so statement 3 can't be tested
until that bug is first fixed (dependancy).
Mass-reassigning bugs to dom_bugs@netscape.com
Assignee: jst → dom_bugs
Attached file Testcase #2
From the Description above:
>The purpose here is to implement
>document.documentElement.clientWidth/clientHeight DHTML properties within Moz
>exactly the way it works within MSIE 6 in standards compliant mode.

I'm afraid that is an impossible goal, see bug 227567 comment 8 and 5.

With the patch in bug 227567, in "Testcase #2", I get diff: 10,10,15,25,25 
which is very close to what I get in IE: 10,10,16,26,26 (the IE scrollbar seems
to be 1px wider).

I think the patch in bug 227567 fixes the problems in this bug (it is very
close to what IE does)  -  or is there something I missed?
Depends on: 227567
Keywords: testcase
OS: Windows XP → All
In the testcase #2, I assume that these are divs all bordered with a 5px solid
border. But still, this bug is about the root (documentElement) element. I
created a simple testpage where the <body> node is entirely empty and I was
still able to get MSIE 6 to output the client area (or rendered area) dimensions
(clientWidth and clientHeight). I fail to see the problem. I have many testcase
pages; if I understood exactly what is the situation, I might be able to help.

You note a 1px difference in the scrollbars. FWIW, one can modify the
width/height of the vertical/horizontal scrollbar in XP for browsers like MSIE 6
and Opera 7 with
Start/Settings/Control Panel/Display/Appearance tab/Advanced button/Item:Scrollbar
and such measurements may vary from Windows theme to theme also.
FWIW, MSIE 6 has a default CSS border declaration on the <html> node which is 
medium #000000 inset
which explains the difference between clientHeight and offsetHeight... which
might be mysterious. 

I understand that the root element is directly associated with the browser
viewport in MSIE 6 when this is not the case (nor the default) in Mozilla.

In any case, Mats, as soon as the fix to bug 227567 is in the trunk, I'll be
happy to run tests for this bug. From the values you get with testcase #2, I
have a hunch that your patch should solve the issues with this bug.
Please file new bugs for any remaining problems (*one issue* per bug report),
including a minimized testcase, thanks.


-> FIXED (by bug 227567)
Status: NEW → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
*** Bug 189112 has been marked as a duplicate of this bug. ***
Followings code works for me in IE6, FF3.5.3, Chrome5.0.375.127, and I think it summarizes the issues well. Felt it was important to post here, since similar new and reopened bugs are marked duplicates of this resolved bug.

   function docElem( property )
   {
      var t
      return ((t = document.documentElement) || (t = document.body.parentNode)) && Util.isNumber( t[property] ) ? t : document.body
   }
   
   // View width and height excluding any visible scrollbars
   // http://www.highdots.com/forums/javascript/faq-topic-how-do-i-296669.html
   //    1) document.client[Width|Height] always reliable when available, including Safari2
   //    2) document.documentElement.client[Width|Height] reliable in standards mode DOCTYPE, except for Safari2, Opera<9.5
   //    3) document.body.client[Width|Height] is gives correct result when #2 does not, except for Safari2
   //    4) When document.documentElement.client[Width|Height] is unreliable, it will be size of <html> element either greater or less than desired view size
   //       https://bugzilla.mozilla.org/show_bug.cgi?id=156388#c7
   //    5) When document.body.client[Width|Height] is unreliable, it will be size of <body> element less than desired view size
   function viewSize()
   {
      // This algorithm avoids creating test page to determine if document.documentElement.client[Width|Height] is greater then view size,
      // will succeed where such test page wouldn't detect dynamic unreliability,
      // and will only fail in the case the right or bottom edge is within the width of a scrollbar from edge of the viewport that has visible scrollbar(s).
      var doc = DocElem( 'clientWidth' ),
         body = document.body,
         w, h
      return Util.isNumber( document.clientWidth ) ? { w : document.clientWidth, h : document.clientHeight } :
         doc === body
         || (w = Math.max( doc.clientWidth, body.clientWidth )) > self.innerWidth
         || (h = Math.max( doc.clientHeight, body.clientHeight )) > self.innerHeight ? { w : body.clientWidth, h : body.clientHeight } :
         { w : w, h : h }
   }
Component: DOM: Mozilla Extensions → DOM
Component: DOM → DOM: Core & HTML
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: