Closed Bug 287603 Opened 20 years ago Closed 20 years ago

Enable WPS URLObjects on the commandline

Categories

(Core Graveyard :: Cmd-line Features, enhancement)

x86
OS/2
enhancement
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: dragtext, Assigned: mkaply)

Details

Attachments

(3 files)

This enhancement allows Mozilla et al. to properly handle WPS URLObjects
specified on the commandline.  Currently, moz apps display the URL they contain;
 this patch will cause them to load the URL instead.  When implemented, users
will finally be able to open Url objects by dropping them on  a Moz or Firefox
program object.

There are two parts to this patch.  The first adds an OS/2 version of
ReadUrlFile() to nsFileProtocolHandler.cpp.  Before Moz reads any datafile, it
calls this method to determine if the file contains a URI.  If so, the method
reads the file and returns the URI which Moz then loads.

The second part of the patch adds some infrastructure to nsLocalFileOS2 to
identify URL objects.  nsLocalFileOS2.idl describes a new interface with two
methods:
- GetFileTypes() returns a scriptable array of filetype strings;  it is not used
currently.
- IsFileType() takes a filetype string and returns true if it matches one of the
file's types;  ReadUrlFile() uses this method.

nsLocalFileOS2.cpp implements these methods along with a private method: 
GetEA().  This is a fairly generic method for fetching any single extended
attribute.  If there's any need, this could be made public and be added to the
new interface.
Attachment #178504 - Attachment mime type: application/octet-stream → text/plain
This is cool stuff.

Any reason not to keep the #ifdefs in ReadURLFile?
(In reply to comment #4)
> Any reason not to keep the #ifdefs in ReadURLFile?

They're all still there, just structured differently.  When Win was the only
platform implementing this, an all-in-one #ifdef worked.  Now it's #ifdef
Win/OS2/other.  The Win-specific #ifdef's are only evaluated within its scope.
If you prefer, I can put OS/2 first & leave the existing stuff alone.
The patch works great here.

After looking at the patched files I also finally understood the new #ifdefs
and they seem OK to me.

>+    PRBool isUrl;
>+    rv = os2File->IsFileType(NS_LITERAL_CSTRING("UniformResourceLocator"),
>+                             &isUrl);

What about files with type "URL" or "WebExplorer_Url"? At the moment you only 
test for "UniformResourceLocator", but I have several (old and new) files with
the other types, although I am not sure which program creates the "URL" ones.

>+    // get a buffer, read the entire file, then create
>+    // an nsURI;  we assume the string is already escaped
>+    char * buffer = (char*)NS_Alloc(fileSize+1);
>+    if (buffer) {
>+        PRInt32 cnt = PR_Read(file, buffer, fileSize);

What happens if the file is very large (and does not just contain a URI)?
Perhaps you should test if the file size is less than some typical URI length
before doing the NS_Alloc? Hmm, I cannot find any restriction of length in the
RFCs... Some of the longest URLs I have seen are from Bugzilla queries and they
are less than 1000 chars, so a limit to 10000 chars should be safe.
(In reply to comment #6)
> What about files with type "URL" or "WebExplorer_Url"? At the moment you only
> test for "UniformResourceLocator", but I have several (old and new) files
> with the other types, although I am not sure which program creates the "URL"
> ones.

I haven't seen a "WebExplorer_Url" in years. And "URL"??  Anyone who writes a
program like that should get his act together and fix it - IMHO, of course.  If
it's really, _really_ necessary (and desirable), I could add this.  However,
note that no one has ever complained that you can't *drop* these on a Moz app. 
If there were really a demand for this, we'd have heard about it by now.

> What happens if the file is very large (and does not just contain a URI)?
> Perhaps you should test if the file size is less than some typical URI length
> before doing the NS_Alloc? [...] a limit to 10000 chars should be safe.

That's not unreasonable.  Actually, I'd be inclined to make the limit 4096.
FWIW...  This patch has an interesting side-effect.  Every time the browser
reads local content (e.g. ua.css), it calls ReadURLFile().  Because of this, any
such file can be relocated and replaced with a URL object.

For example, I moved bin/res/builtin/platformHTMLBindings.xml to my Desktop and
replaced it with a URL object pointing to its new location.  To test, I added a
new key binding to the file on my Desktop, then started Fx.  Sure enough, my
change was in effect (Ctrl-Q to Copy).

I have no idea if this has any practical benefit (or security implication) but I
thought it interesting enough to mention.  Although I haven't tested it, the
same effect should already be present in the Win version.

If you want to see what files are affected, add this toward the top of the OS/2
version of nsFileProtocolHandler::ReadURLFile():
=====
        return NS_ERROR_NOT_AVAILABLE;

+   static int ctr = 0;
+   nsCAutoString path;
+   os2File->GetNativePath(path);
+   printf( "ReadURLFile - ctr= %d  path= '%s'\n", ++ctr, path.get());
+
    // see if this file is a WPS UrlObject
=====
> Although I haven't tested it, the
> same effect should already be present in the Win version.

nah, on windows, those files need to end in ".url"
Where is GetFileTypes called from?
Never mind - r/sr=mkaply, a=mkaply. I'll check this in.
Fix checked in to trunk.
Status: NEW → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: