[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kfm-devel
Subject:    Re: Old Flash? Go upgrade! - New problem with konqueror
From:       "Maksim Orlovich" <mo85 () cornell ! edu>
Date:       2010-04-19 19:14:53
Message-ID: 61900.67.246.70.185.1271704493.squirrel () webmail ! cornell ! edu
[Download RAW message or body]

> 2010/4/19 Maksim Orlovich <mo85@cornell.edu>:
>>
>>> With some hacking, I indeed get youtube working.
>>
>> Could you elaborate on what exactly you had to do? I am a bit lost here.
>
> Like mentioned kmplayer I had to make sure the plugin creation goes
> sync, had to bypass a few timeout redirects too.

OK. nspluginviewer's startup is embarrassingly sync, so that's one thing I
probably don't have to worry about.

> Also I need the correct src/movie url, not the docbase. The kpart
> constructor gets the width/height attribute, but not the src
> attribute. Modified the test case as
>
> ...
>    flash.setAttribute("type", "application/x-shockwave-flash");
>    flash.setAttribute("width", "400");
>    flash.setAttribute("height", "300");
>    flash.setAttribute("src", "lux.swf");
>    if ((appendFlash = body.appendChild(flash)) && appendFlash.GetVariable)
> {
>                 version = appendFlash.GetVariable("$version");
>    };
>    body.removeChild(flash);
>    document.write(version);
> ..
> (so width/height/src added)

See, this is what I am confused about. Shouldn't the testcase work
w/o an actual flash file (and also w/o width and height)?

The khtml bug I see it that it views the empty string as relative to
document, and hence completes it to the page URL (might be right for empty
but not null, too). I would think the right thing to do would be to pass
an empty string to openUrl? nspluginviewer has some code for that (it just
does the wrong thing).


>>> KHTML also seems to forget calling closeUrl in the test case
>>> 'body.removeChild(flash);'.
>>
>> closeUrl, or destroying the plugin instance entirely, I wonder?
>
> Either way are fine with me.

Please see the attached. I would appreciate if you told me if it
fixes the youtube-still-playing-sound issue for you.

> At the end of the script, the 'flash' variable goes out of scope, so
> no reference to this DOM object. Might be the cause of destruction
> too, dunno.

Well, going out of scope doesn't mean much since garbage collection might
not happen for a long time.

>> This one should be fixed in more recent versions, if my memory serves me
>> right.
>
> My 4.4 checkout is from yesterday. Can the fix be backported then?

Hmm. It should have been fixed by r1077278, which is way older than that.
Might be a different bug hitting the same assert then.


["object-not-in-document.diff" (text/x-patch)]

Index: html/html_objectimpl.cpp
===================================================================
--- html/html_objectimpl.cpp	(revision 1116550)
+++ html/html_objectimpl.cpp	(working copy)
@@ -239,13 +239,20 @@
 void HTMLObjectBaseElementImpl::removedFromDocument()
 {
     document()->underDocNamedCache().remove(m_name, this);
-    HTMLElementImpl::removedFromDocument();
+
+    // When removed from document, we destroy the widget/plugin.
+    // We have to do it here and not just call setNeedComputeContent(),
+    // since khtml will not try to restyle changed() things not in document.
+    clearChildWidget();
+    
+    HTMLPartContainerElementImpl::removedFromDocument();
 }
 
 void HTMLObjectBaseElementImpl::insertedIntoDocument()
 {
     document()->underDocNamedCache().add(m_name, this);
-    HTMLElementImpl::insertedIntoDocument();
+    setNeedComputeContent();
+    HTMLPartContainerElementImpl::insertedIntoDocument();
 }
 
 void HTMLObjectBaseElementImpl::removeId(const DOMString& id)
@@ -364,6 +371,12 @@
         return;
     }
 
+    // Not in document => no plugin.
+    if (!inDocument()) {
+        clearChildWidget();
+        return;
+    }
+
     // Collect information from <param> children for ...
     // It also sometimes supplements or replaces some of the element's attributes
     for (NodeImpl* child = firstChild(); child; child = child->nextSibling()) {

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic