Closed
Bug 64041
Opened 24 years ago
Closed 24 years ago
LocationImpl::SetHash QIs for wrong interface
Categories
(Core :: DOM: Core & HTML, defect)
Core
DOM: Core & HTML
Tracking
()
RESOLVED
FIXED
mozilla0.8
People
(Reporter: dbaron, Assigned: jst)
Details
(Whiteboard: [HAVE FIX])
Attachments
(3 files)
22.61 KB,
patch
|
Details | Diff | Splinter Review | |
27.86 KB,
patch
|
Details | Diff | Splinter Review | |
28.07 KB,
patch
|
Details | Diff | Splinter Review |
LocationImpl::SetHash contains the lines:
nsIURL* url;
result = uri->QueryInterface(NS_GET_IID(nsIURI), (void**)&url);
This is evil - you QI for nsIURI into an nsIURL* and then assume you can call
SetRef. You're better off switching to an nsCOMPtr and using the typesafe
do_QueryInterface:
nsCOMPtr<nsIURL> url( do_QueryInterface(uri, &result) );
Assignee | ||
Comment 1•24 years ago
|
||
Nice catch, I have a huge patch that cleans up nsLocation.cpp and fixes this
problem, the cleanup is mostly converting the code to using nsCOMPtr's and
nsXPIDLCString's.
Status: NEW → ASSIGNED
Whiteboard: [HAVE FIX]
Target Milestone: --- → mozilla0.8
Assignee | ||
Comment 2•24 years ago
|
||
Assignee | ||
Comment 3•24 years ago
|
||
Looking for r= and sr=.
Reporter | ||
Comment 4•24 years ago
|
||
The only error I see that should prevent this from being checked in is in
LocationImpl::SetProperty, where you meant to replace JS_GetStringBytes
with JS_GetStringChars but did not. (The need for a reinterpret_cast
from jschar (uint16) to wchar_t hides the fact that you used the wrong
function.)
With that fixed (and my last comment below at least examined), r=dbaron.
However, some other things I noticed that you may want to fix:
The way you find out whether NS_NewURI succeeded is inconsistent:
sometimes you null-check the URI and sometimes you check the result.
(Also you sometimes return on failure and sometimes make the rest of
function conditional on success.)
The frequent use of |nsIURI* url| rather than |nsIURI* uri| can be
confusing, especially since there are places where you deal with |nsIURI
*uri| and |nsIURL *url| in the same function. Then again, ugly patterns
like that exist throughout the code.
The way the code is set up, it seems like calling GetHostname on
about:blank (say, in a frame) would fail but return NS_OK (since I
think about:blank could be represented as an nsSimpleURI, which doesn't
implement nsIURL, right?). Should that be a more sensible error (e.g.,
a DOM exception)? Or can that happen at all? (Can an nsSimpleURI ever
end up here? Do frames have a location object?) Maybe at least you
should use do_QueryInterface(..., &rv)?
When you test an nsXPIDLCString as a boolean, perhaps .get() would make
things clearer, e.g. (in GetSearch):
if (NS_SUCCEEDED(result) && search.get() && *(search.get()))
I assume it works the way you intended (or didn't think of changing),
although I'm not 100% sure.
Assignee | ||
Comment 5•24 years ago
|
||
Assignee | ||
Comment 6•24 years ago
|
||
Oops! Well, the JS_GetStringBytes is fixed in the new patch, nsIURI variables
are no longer named url, error checking is more consistent. Not sure what to say
about calling GetHostname on about:blank, it should just work, there's no host
so you'll get an empty string, there's no nsIURL used in GetHostname, I'll
attach a third patch that makes sure we do throw an exception if someone tries
to *set* a property that is only available in nsIURL's and the current location
is pointing to a nsIURI.
As for testing nsXPIDL[C]String's as booleans I intentionally left those as just
if (.. && ref && *ref) since IMO nsXPIDL[C]String's are supposed to be as opaque
as they can and you should think they are just [PRUni]char pointers with the
benefit of having their own memory management, kinda like nsCOMPtr's. And yes,
it does work as I intended.
Assignee | ||
Comment 7•24 years ago
|
||
Assignee | ||
Comment 8•24 years ago
|
||
Patch checked in, marking FIXED.
Status: ASSIGNED → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
Comment 9•24 years ago
|
||
David Baron, do you want to verify this one ?
You need to log in
before you can comment on or make changes to this bug.
Description
•