Closed Bug 241092 Opened 20 years ago Closed 20 years ago

make nsIStreamLoaderObserver usable from javascript

Categories

(Core :: Networking, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla1.8alpha1

People

(Reporter: Biesinger, Assigned: Biesinger)

References

Details

Attachments

(2 files, 1 obsolete file)

from bug 240920 comment 2
 ------- Additional Comment #2 From Christian Biesinger  2004-04-18 17:10 PDT 
[reply] -------

(From update of attachment 146449 [details] [diff] [review])
I'd also like to change the "result" parameter of the streamloaderobserver to
"[const,array,size_is(resultLength)]in octet result"

this bug is for that change :)

the current usage of |string| makes it impossible to use this method from
javascript, when 0-bytes or bytes with a set 8th bit are present.
Attached patch patch (obsolete) — Splinter Review
Status: NEW → ASSIGNED
Target Milestone: --- → mozilla1.8alpha
Comment on attachment 146612 [details] [diff] [review]
patch

>Index: widget/src/gtk2/nsSound.cpp

>+#define GET_DWORD(s, i) (s[i+3] << 24) | \
>+    (s[i+2] << 16) | (s[i+1] << 8) | \
>+    s[i]

all on one line seems better:

#define GET_DWORD(s, i) (s[i+3] << 24) | (s[i+2] << 16) | (s[i+1] << 8) | s[i]

78 characters by my count =)


> NS_IMETHODIMP nsSound::OnStreamComplete(nsIStreamLoader *aLoader,
>                                         nsISupports *context,
>                                         nsresult aStatus,
>                                         PRUint32 stringLen,
>+                                        const PRUint8 *string)

hmm, maybe the variable should be named differently... like

  data _and_ dataLen

what'd you think?  (that way someone doesn't misuse it as a "string")


>     /* open up conneciton to esd */  
>     EsdPlayStreamFallbackType EsdPlayStreamFallback = 
>         (EsdPlayStreamFallbackType) PR_FindSymbol(elib, 
>                                                   "esd_play_stream_fallback");
>+    // XXX what if that fails?

maybe file a bug on this?


>Index: widget/src/gtk/nsSound.cpp

>+                                        const PRUint8 *string)

same nit about the name of this parameter.


>Index: widget/src/mac/nsSound.cpp

>+                                        const PRUint8 *stringData)

again, it's not really "string" data, right?


>Index: widget/src/os2/nsSound.cpp

>+                                        const PRUint8 *string)

same nit


>Index: widget/src/windows/nsSound.cpp

>+                                        const PRUint8 *string)

same nit


>+    // XXX we have sharable strings now! but the passed-in
>+    // data is not a string, it's an array of bytes

maybe this doesn't need to be a XXX comment anymore?


>+    theMM.PlaySound(NS_REINTERPRET_CAST(const PRUint8*, string), 0, flags);

isn't this cast redundant?


>Index: content/base/src/nsScriptLoader.cpp

>+                                 const PRUint8* string)

in this case "string" seems right.


>Index: content/xul/document/src/nsXULDocument.cpp

>+        // XXX this seems broken - what if the script is non-ascii?
>+        nsString stringStr; stringStr.AssignWithConversion(NS_REINTERPRET_CAST(const char*, string), stringLen);

maybe file a bug on this too since it seems like it could happen.


>Index: netwerk/base/src/nsStreamLoader.cpp

>     mObserver->OnStreamComplete(this, mContext, aStatus, 
>+                                mData.Length(), NS_REINTERPRET_CAST(const PRUint8*, mData.get()));

maybe bring the NS_REINTERPRET_CAST down to the next line to make it more
readable for those with narrow text editors :-)


r=darin (Thanks for doing this!)
Attachment #146612 - Flags: review?(darin) → review+
filed Bug 241738 on nsSound crashing when esd symbols are unavaialble
filed Bug 241739 about nsXULDocument and non-ascii scripts
(In reply to comment #2)
> all on one line seems better:

Hm, indeed. it's also what gtk1 does.

> hmm, maybe the variable should be named differently... like
> 
>   data _and_ dataLen
> 
> what'd you think?  (that way someone doesn't misuse it as a "string")

Good idea, I'll change that.

> maybe this doesn't need to be a XXX comment anymore?

I decided to remove it (as sharable strings could only be relevant if this is
passed in as an ACString, and I don't see that happening, as that is no string)

> >+    theMM.PlaySound(NS_REINTERPRET_CAST(const PRUint8*, string), 0, flags);
> 
> isn't this cast redundant?

Er, yeah. I meant to cast to const char*. Will fix.

> >Index: netwerk/base/src/nsStreamLoader.cpp
> 
> >     mObserver->OnStreamComplete(this, mContext, aStatus, 
> >+                                mData.Length(), NS_REINTERPRET_CAST(const
PRUint8*, mData.get()));
> 
> maybe bring the NS_REINTERPRET_CAST down to the next line to make it more
> readable for those with narrow text editors :-)

changed to:
    mObserver->OnStreamComplete(this, mContext, aStatus, 
                                mData.Length(),
                                NS_REINTERPRET_CAST(const PRUint8*,
                                                    mData.get()));
to fit into 80 columns
Attached patch patch v2Splinter Review
Attachment #146612 - Attachment is obsolete: true
Attachment #147048 - Flags: review?(bryner)
Attached patch camino patchSplinter Review
looks like camino also has an impl of nsIStreamLoaderObserver, this patch fixes
it
Comment on attachment 147048 [details] [diff] [review]
patch v2

>--- widget/src/gtk2/nsSound.cpp	18 Apr 2004 22:00:17 -0000	1.9
>+++ widget/src/gtk2/nsSound.cpp	26 Apr 2004 14:04:38 -0000
>@@ -158,51 +158,51 @@ NS_IMETHODIMP nsSound::OnStreamComplete(
>     }
> #endif
> 
>     int fd, mask = 0;
>     unsigned long samples_per_sec=0, avg_bytes_per_sec=0;
>     unsigned long rate=0;
>     unsigned short format, channels = 1, block_align, bits_per_sample=0;
> 
>-    if (PL_strncmp(string, "RIFF", 4)) {
>+    if (memcmp(data, "RIFF", 4)) {

You've made this check case-sensitive on gtk 1/2 but not on other toolkits. 
Why?

Looks ok other than that.
Attachment #147048 - Flags: review?(bryner) → review+
(In reply to comment #8)
> >-    if (PL_strncmp(string, "RIFF", 4)) {
> >+    if (memcmp(data, "RIFF", 4)) {
> 
> You've made this check case-sensitive on gtk 1/2 but not on other toolkits. 
> Why?

hm, indeed, I missed OS/2. I'll change that. but PL_strncmp is not
case-sensitive either.
Attachment #147048 - Flags: superreview+
checked in
Status: ASSIGNED → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
This has caused bug 242939.

The reason is the streamobserver used at:

http://lxr.mozilla.org/mozilla/source/calendar/resources/content/calendarManager.js#702

considers "result" to be a string.

Now that it is an octet array, how could it be converted to a string in JS?
Blocks: 242939
(In reply to comment #11)
> considers "result" to be a string.

*sigh*
what if the data is UTF-16? or any non-ascii data?

> Now that it is an octet array, how could it be converted to a string in JS?

try: var my_string = String.fromCharCode.apply(this, result);
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: