Closed Bug 33650 Opened 26 years ago Closed 26 years ago

Frame named "content" can't be accessed via parent.content

Categories

(Core :: Layout: Images, Video, and HTML Frames, defect, P3)

defect

Tracking

()

VERIFIED FIXED

People

(Reporter: pollmann, Assigned: danm.moz)

References

()

Details

(Whiteboard: [nsbeta2+])

Attachments

(2 files)

Clicking on a menu link in the left frame causes the toplevel window to be updated. This is because the frame that is supposed to be updated is named "content". The frame is updated like this: parent.content.location="http://... This works in Nav, but doesn't work in Gecko.
Attached file inner frame
Attached file Reduced test case
Here is a less technical description of this bug. Overview Description: Url causes menu frames to be lost. Steps to Reproduce: 1) Goto http://www.securityfocus.com/ 2) Click on Forums -> Mailing Lists -> Bugtraq 3) Observe that the menu disappears Actual Results: The right window opens fully and the menu disappears. Expected Results: The menu should still be there with three submenus. Reproducibility: Everytime. Build Date & Platform Bug Found: Mozilla/5.0 (X11; U; Linux 2.2.12-20 i686; en-US; m14) Build 2000040723 Additional Builds and Platforms Tested On: win98 Additional Information: Works fine in netscape 4.x and opera.
Verified that attachment (id=7046) is a reduced test case. 2000040723 Linux i686
Status: NEW → ASSIGNED
Target Milestone: --- → M18
So the interesting thing here is that GlobalWindowImpl::Resolve is called a number of times with some very very odd class names, but never with the "content" name that should be resolved from the parent. Shaver, hadn't we found this ::Resolve function to before being called by some very odd names that shouldn't be being called. What was our fix there?
The fixes were to use mechanisms for class initialization that didn't result in a full-scope-chain walk the first time through. I recall that XPConnect and the DOM were implicated, and I dimly recall that they were actually fixed. What odd names are you seeing go through GlobalWindowImpl::Resolve now?
Resolve is called with such exciting class names as: 1.) HTMLDocument originating from http://lxr.mozilla.org/seamonkey/source/dom/src/html/nsJSHTMLDocument.cpp#1197 2.) HTMLHtmlElement originating from http://lxr.mozilla.org/seamonkey/source/dom/src/html/nsJSHTMLHtmlElement.cpp#234 3.) HTMLBodyElement originating from http://lxr.mozilla.org/seamonkey/source/dom/src/html/nsJSHTMLBodyElement.cpp#364 4.) HTMLAnchorElement originating from http://lxr.mozilla.org/seamonkey/source/dom/src/html/nsJSHTMLAnchorElement.cpp#7 68 5.) valueOf from some XPConnect code. 6.) toString from some XPConnect code
Ok, I just went and talked to brendan about this, and basically the problem with the content thing is that it has been defined in domidl as an attribute. So the problem is that .content was added to allow getting to the primary content shell of a window. This however breaks sites that name their frames content. So we need to remove this notation capability to get to the primary frame. Flipping to hyatt since I think he created all this fun. :)
Assignee: pollmann → hyatt
Status: ASSIGNED → NEW
To recap my conversation with travis: Window.idl is wrongly predefining content as an attribute, which predefines a JS property and preempts that name from being resolved to a user-defined HTML frame. The DOM idl attribute should be removed, and global window resolve should try for the _content target iff it doesn't find a user-defined frame named "content". Travis, is your six-item-list an exhaustive list? 1-4 are due to the way DOM-idlc-generated code bootstraps its class definition, and should happen once per class per document load in a window or frame. 5 and 6 seem like bugs, probably in JS code, where someone is passing window to an XPConnected method that expects a string or possibly an int or other numeric type. Jband? /be
What Brendan suggests has been done. This code, for instance: <?xml version="1.0"?> <!DOCTYPE window> <window xmlns:html="http://www.w3.org/TR/REC-html40" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" title = "replaceable content test"> <html:script> function runtest() { dump("window.content begins = '"+window.content+"'\n"); window.content=16; dump("window.content set to integer, now = '"+window.content+"'\n"); } </html:script> <html:button onclick="runtest()">Test</html:button> </window> when the "Test" button is pressed, prints this: window.content begins = '[object Window]' window.content set to integer, now = '16' This works because the DOM Window "content" attribute is defined as readonly replaceable. JS returns the predefined attribute only until other JS has changed it to something else; JS then treats it as a user variable. This is working today: I just ran this test. It must be something else that's causing this bug.
Maybe I'm doing something wrong, but I'm not seeing the lookups that travis mentioned. I am seeing all the lookups associated with init'ing the JS classes as the JSContext is populated with new stuff. I breaking at nsJSUtils::nsGlobalResolve after clicking on the indicated links in the pages mentioned in the bug report. The proto trick that shaver mentioned to xpconnect is at: http://lxr.mozilla.org/seamonkey/source/js/src/xpconnect/src/xpcwrappednativecla ss.cpp#1242 I *don't* see a resove associated with it. I do see a search for the costructor for this JS class I init: http://lxr.mozilla.org/seamonkey/source/js/src/xpconnect/src/xpcwrappedjsclass.c pp#1087 That can be fixed. And, I certainly should fix this rather naked looking call to create instances of that object (used to hold 'out' params when native code calls JS code). http://lxr.mozilla.org/seamonkey/source/js/src/xpconnect/src/xpcwrappedjsclass.c pp#1106
danm: your test case doesn't seem to include any interaction with frame naming, which is at the core of this bug, I think. The accessors for window.[[property]] need to check first to see if there's a frame named by [[property]], in which case they should return a reference to that frame, rather than the DOM1+ value.
Ah. I can see where the frame lookup code would be a third path, not covered by the "replaceable" attribute. Damn. That's disappointing.
No my list was not exhaustive. Basically I just broughtup the attached test case and then set the breakpoint on GlobalWindowImpl::Resolve and then watched what came through.
Ok, we just talked about this a little bit ago and basically we don't want to lose the functionality, but we want to make this test case work and make these namings consistent with the targets such as "_content", "_content_mail" etc. So basically we will add a window.getContent(in string). This in string will be "_content" or one of the others. null passed will basically do what window.content does now which is to return the primary content area within the current window. I don't have the time to implement this right now, but if anyone else does, I am more than happy to help. Otherwise this is on the back back burner for a while.
*** Bug 34959 has been marked as a duplicate of this bug. ***
Blocks: 31378
Blocks: 35726
travis, when you say you plan to add a window.getContent(in string), do you intend for this to be the only way to access the attribute? For my project, I need the ability to set the content attribute to a different frame, not just read it. I just hope that functionality doesn't go away.
woo
Assignee: hyatt → danm
Since this bug is set as blocker for 31378,35726 and those are already nominated nsbeta2, then adding nsbeta2 to this one (effectively either a resolution to the window.content && frames problem goes in beta2, or they all get pushed out).
Keywords: nsbeta2
[nsbeta2+]
Whiteboard: [nsbeta2+]
Blocks: 35244
It wasn't possible to double-team the use of window.content; returning our meaning unless it had been overridden by HTML. And Travis' suggestion of adding a getContent method stuck in our collective craw. As did every other possible solution. I finally went with a name change: content has become _content. Of course if someone out there is using HTML with frames named _content, we'll have the same problem all over again. But there's a precedent for thinking of names beginning with an underscore as reserved, so I'm optimistic. In the end, because of the importance of our content property to XUL, we'll just have to keep changing the property's name to something that no one has ever used before. At least there 's no longer a problem with _this_ page.
Status: NEW → RESOLVED
Closed: 26 years ago
Resolution: --- → FIXED
Fixed in the June 26th build (200062608).
Status: RESOLVED → VERIFIED
Product: Core → Core Graveyard
Component: Layout: HTML Frames → Layout: Images
Product: Core Graveyard → Core
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: