Closed Bug 117410 Opened 23 years ago Closed 22 years ago

image not loaded if SRC URL has a leading SPACE character.

Categories

(Core :: Networking: HTTP, defect)

x86
Windows 2000
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: jrgmorrison, Assigned: badami)

References

Details

(Whiteboard: [patch needs r/sr=])

Attachments

(1 file, 8 obsolete files)

Almost hate to file a bug like this, but this works in Nav4.x, IE and
worked in the 6.2 release. It stopped working between 11/15 and 11/20
(of builds that I had lying around). Given that the url rewrite landed
on 11/15, I'm guessing that this is related (although possibly not).

Anyways ... if you have a <IMG SRC="..."> and the URL in the SRC
attribute has a leading SPACE character, the image will not
load. Curiously, if it has a leading TAB character, the image will
load (i.e., a leading TAB is stripped, but a leading SPACE is not
stripped from the URL).

I'll attach a simple test case in one moment.
take two. (I accidentally expanded the tab in the first attachment when
cutting/pasting from a remote term window).
Attachment #63055 - Attachment is obsolete: true
Hmmmm ... if I remember correctly stripping spaces was removed from resolving
relative urls some time ago, not just with the urlparser rewrite. AFAIK that was
moved to the customers of ::Resolve because some of them wanted the space
preserved, some not.
Take a look at the discussion in bug 50285 for more details.
src="" is a URI which is defined as a CDATA element.
http://www.w3.org/TR/html401/sgml/dtd.html#URI

This is a likely dupe of Bug 87894  - "Leading and trailing whitespace should be
trimmed from CDATA attributes in quirks mode"

The fact that it worked on the branch was because of bug 79929 I'm sure...
-> badami
Assignee: darin → badami
This is not a networking issue in my opinion. We should not strip
leading/trailing spaces on relative urls. This has to be done by the customer of
::Resolve in context of the situation and before the string is given to ::Resolve.
Attached patch trim uri for leading spaces (obsolete) — Splinter Review
Whiteboard: [patch needs r/sr=]
Okay, I was on the wrong trip here, thinking about relative urls. If it is an
absolute URL the spaces should be left/right trimmed from the url. But why not
move that trim into FilterString?
 
Looks like StripChars does what the FilterString routine was doing.
Note that i need to pass the cleaned up spec to ParseURL and
BuildNormalizedSpec since they will be noting offsets into this string for the
various URI components.
Comment on attachment 71644 [details] [diff] [review]
remove FilterString and replace it by StripChars

vinay: FilterString does more than StripChars... it avoids a costly string copy
when there is nothing to filter.  let's not remove it.	instead, can you fix
FilterString to do the right thing?
Attachment #71644 - Flags: needs-work+
Attachment #71637 - Attachment is obsolete: true
Attachment #71644 - Attachment is obsolete: true
Attached patch modify FilterString (obsolete) — Splinter Review
1. Return with PR_FALSE on null string.
2. Strip leading spaces. 
3. Strip trailing spaces.
Comment on attachment 71853 [details] [diff] [review]
modify FilterString

Append null terminates, so there is no need to worry about null terminating
|p|... also no need to worry about restoring str to original state to preserve
constness.
Attachment #71853 - Flags: needs-work+
Attached patch with darins comments (obsolete) — Splinter Review
Attachment #63057 - Attachment is obsolete: true
Attachment #71853 - Attachment is obsolete: true
Comment on attachment 72011 [details] [diff] [review]
with darins comments

a few more comments (i should have caught these before)...

> nsStandardURL::FilterString(const char *str, nsCString &result)
> {
>+    if (!str) 
>+        return PR_FALSE;

this check should be moved to nsStandardURL::SetSpec after the call to Clear()


>+    PRBool firstNonWhiteSpace = PR_FALSE;

instead of checking this variable everytime through the loop we
should have a separate loop for removing leading whitespace.

like so:

for (; *p; ++p) {
  if (*p == ' ') {
    writing = PR_TRUE;
    str = p + 1;
  }
}

then follow with the existing loop to remove control characters:

for (; *p; ++p) {
  if (*p == '\t' || ... ) {
    // ...
  }
}

and finally, a third loop to strip trailing white space:

>+    // Remove trailing spaces if any
>+    const char* end = (char*)p;
>+    while (((p-1) >= str) && (*(p-1) == ' ')) {
>+        writing = PR_TRUE;
>+        p--;
>     }

doesn't look like |end| is needed.

i'm being especially picky here because SetSpec is called thousands of
times during startup and thousands of times during page load.
Attachment #72011 - Flags: needs-work+
Attached patch with 3 loops (obsolete) — Splinter Review
Attachment #72011 - Attachment is obsolete: true
Comment on attachment 72349 [details] [diff] [review]
with 3 loops


>Index: nsStandardURL.cpp

>+    // Remove leading spaces
>+    while (*p && (*p == ' ')) {

while (*p == ' ')

is equivalent


>+    NS_PRECONDITION(spec, "null pointer");
>+    if(!spec)
>+        return NS_ERROR_INVALID_ARG;

sorry, i think i gave you misleading advice.  either it is valid
to pass in a NULL spec, meaning that the URL gets completely
cleared, or it is invalid to pass in a NULL spec, and nothing
should change.	this patch would not satisfy either approach.

i'd prefer to say that a NULL spec simply clears the URL.

so this NULL check (after the call to Clear()), should silently
return NS_OK.
Attachment #72349 - Flags: needs-work+
Attached patch oen more (obsolete) — Splinter Review
1. Changed while (*p && (*p == ' ')) to while (*p == ' ')
2. Return NS_OK if spec was null after clearing URL.
Attachment #72349 - Attachment is obsolete: true
Comment on attachment 72553 [details] [diff] [review]
oen more

i meant that the NS_PRECONDITION should be removed since it seems to suggest
that the caller is in error... with that, sr=darin :-)
Attachment #72553 - Flags: superreview+
Comment on attachment 72553 [details] [diff] [review]
oen more

r=bbaetz with the precondition removed.
Attachment #72553 - Flags: review+
Shouldn't you filter out the control characters before stripping
leading/trailing whitespace? Otherwise stuff like "   \n   http://ocallahan.org"
won't work.
Darin, Bbaetz
Can u folks r/srf this once more please ?
Attachment #72553 - Attachment is obsolete: true
Comment on attachment 72952 [details] [diff] [review]
removing leading tabs and CRLF too

badami: you're going to hate this, but the old for loop in the code could be
collapsed into a while() loop which would avoid testing (*p != 0) :-)

with that sr=darin
Attachment #72952 - Flags: superreview+
Comment on attachment 72952 [details] [diff] [review]
removing leading tabs and CRLF too

a=asa (on behalf of drivers) for checkin to the 1.0 trunk
Attachment #72952 - Flags: approval+
fixed with checkin

D:\mozilla\netwerk\base\src>cvs commit
cvs commit: Examining .
Checking in nsStandardURL.cpp;
/cvsroot/mozilla/netwerk/base/src/nsStandardURL.cpp,v  <--  nsStandardURL.cpp
new revision: 1.17; previous revision: 1.16
done
Status: NEW → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
*** Bug 135168 has been marked as a duplicate of this bug. ***
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: