User:Torisugari
Contents
nsBaseChannel
- In writing a protocol handler, probably nsBaseContentStream is not so useful as is expected, especially if the server response has header/footer. A class which inherits from nsBaseContentStream has nsIAsyncInputStream::OnInputStreamReady(...) as a input event callback. All OnInputStreamReady can do is just to consume given input stream. i.e. It can't split the stream into a header stream and content stream, effectively. When parsing a header, we should give left-over-buffer back to the input stream. At the moment, the only way to implement such a feature is to use nsIStreamListener::OnDataAvailable(...), because we can call it recursively as many as we like to. In the end, splitting from a socket input stream into header/content/footer is a kind of stream converter.
By the way, we can override nsMyProtocolChannel::OnDataAvailabe in this way:
NS_IMETHODIMP nsMyProtocolChannel::OnDataAvailabe(nsIRequest* aRequest, nsIInputStream* aInputStream, nsISupports* aContext, PRUint32 aCount, PRUint32 aOffset) { return nsBaseContentStream::OnDataAvailable(aRequest, aInputStream, aContext, aCount, aOffset); }
This should work as if it were a stream converter and can reduce a lot of overheads. So, private -> protected...?
Application Name Paranoia
Situation
Mozilla builds have 2 values to set application name, MOZ_APP_NAME and MOZ_APP_DISPLAYNAME.
- MOZ_APP_NAME is a internal name. typically lower-cased string e.g. "firefox".
- MOZ_APP_DISPLAYNAME is a user-visible name. tipically title-cased string e.g. "Firefox".
Firefox 2.0 | Firefox 3.0 | Nightly (1.9) | Debian Iceweasel 2.0 | ||
---|---|---|---|---|---|
MOZ_APP_NAME | firefox | firefox | firefox | firefox | |
MOZ_APP_DISPLAYNAME | Firefox | Firefox | Minefield | Iceweasel | |
- | |||||
nsXREAppData::name | Firefox (hardcoded) | Firefox (hardcoded) | Firefox (hardcoded) | Firefox (hardcoded) | |
nsXREAppData::vendor | Mozilla (hardcoded) | Mozilla (hardcoded) | Mozilla (hardcoded) | Mozilla (hardcoded) | |
Executable Name (unix) | firefox-bin (hardcoded) | firefox-bin (MOZ_APP_NAME) | firefox-bin (MOZ_APP_NAME) | firefox-bin (hardcoded) | |
UA String | MOZ_APP_DISPLAYNAME | MOZ_APP_DISPLAYNAME | MOZ_APP_DISPLAYNAME | MOZ_APP_DISPLAYNAME | |
Archive Package Name | MOZ_APP_NAME | MOZ_APP_NAME | MOZ_APP_NAME | iceweasel (hardcoded) | |
Installer Package Name | MOZ_APP_NAME | MOZ_APP_NAME | MOZ_APP_NAME | (iceweasel (hardcoded)) | |
MacOSX (.app) Name | MOZ_APP_DISPLAYNAME | MOZ_APP_DISPLAYNAME | MOZ_APP_DISPLAYNAME | (MOZ_APP_DISPLAYNAME) | |
Windows DDE (installer) | Firefox (hardcoded) | Firefox (hardcoded) | Firefox (hardcoded) | (Firefox (hardcoded)) | |
XRemote (-a APPNAME) | firefox (nsXREAppData::name + ToLowerCases) | firefox (nsXREAppData::name + ToLowerCases) | firefox (nsXREAppData::name + ToLowerCases) | firefox (nsXREAppData::name + ToLowerCases) | |
- | |||||
Default Profile (script) | ~/.mozilla/firefox (hardcoded) | ~/.mozilla/firefox (hardcoded) | ~/.mozilla/firefox (hardcoded) | ~/.mozilla/firefox (hardcoded) | |
Default Profile (Directory Service) | ~/.mozilla/firefox (nsXREAppData::vender, nsXREAppData::name) | ~/.mozilla/firefox (nsXREAppData::vender, nsXREAppData::name) | ~/.mozilla/firefox (nsXREAppData::vender, nsXREAppData::name) | ~/.mozilla/firefox (nsXREAppData::vender, nsXREAppData::name) |
Proposal
Actually, the browser needs 3 names, that is, "firefox", "Minefield" and "Firefox" (See "Nightly" in the above table), respecitively MOZ_APP_NAME, MOZ_APP_DISPLAYNAME and nsXREAppData::name.
MOZ_APP_BRANDNAME
So I'd like to suggest to add a new flag MOZ_APP_BRANDNAME as below.
Nightly (proposal) | |
---|---|
MOZ_APP_NAME | firefox |
MOZ_APP_DISPLAYNAME | Firefox |
MOZ_APP_BRANDNAME | Minefield |
- | |
nsXREAppData::name | MOZ_APP_DISPLAYNAME |
Executable Name | MOZ_APP_NAME |
UA String | MOZ_APP_BRANDNAME |
Archive Package Name | MOZ_APP_NAME |
Installer Package Name | MOZ_APP_NAME |
MacOSX (.app) Name | MOZ_APP_DISPLAYNAME (Minefield -> Firefox) |
Windows DDE (installer) | MOZ_APP_DISPLAYNAME |
XRemote (-a APPNAME) | nsXREAppData::name + ToLowerCases |
More Backwards Compatible
Or, MOZ_APP_TITLENAME, to minimize the changes.
Nightly (proposal2) | |
---|---|
MOZ_APP_NAME | firefox |
MOZ_APP_DISPLAYNAME | Minefield |
MOZ_APP_TITLENAME | Firefox |
- | |
nsXREAppData::name | MOZ_APP_TITLENAME |
Executable Name | MOZ_APP_NAME |
UA String | MOZ_APP_DISPLAYNAME |
Archive Package Name | MOZ_APP_NAME |
Installer Package Name | MOZ_APP_NAME |
MacOSX (.app) Name | MOZ_APP_TITLENAME (Minefield -> Firefox) |
Windows DDE (installer) | MOZ_APP_TITLENAME |
XRemote (-a APPNAME) | nsXREAppData::name + ToLowerCases |
ToLowerCases Everywhere
Anyway, we need "Firefox" rather than "firefox", because it's easy to create "firefox" from "Firefox", on the other hand, it's difficult to create "Firefox" from "firefox".
Nightly (proposal3) | |
---|---|
MOZ_APP_NAME | Firefox |
MOZ_APP_DISPLAYNAME | Minefield |
- | |
nsXREAppData::name | MOZ_APP_NAME |
Executable Name | MOZ_APP_NAME + ToLowerCases |
UA String | MOZ_APP_DISPLAYNAME |
Archive Package Name | MOZ_APP_NAME + ToLowerCases |
Installer Package Name | MOZ_APP_NAME + ToLowerCases |
MacOSX (.app) Name | MOZ_APP_NAME (Minefield -> Firefox) |
Windows DDE (installer) | MOZ_APP_NAME |
XRemote (-a APPNAME) | nsXREAppData::name + ToLowerCases |
readonly (or readOnly) property for <xul:browser/> element
The basic idea is replacing the content area with <html:canvas>, to prevent from users clicking links etc.
Misc Code Fragments
Get system locale for bug 265400[1]
nsCOMPtr<nsILocaleService> localeService(do_GetService(NS_LOCALESERVICE_CONTRACTID, &rv)); nsCOMPtr<nsILocale> locale; rv = localeService->GetSystemLocale(getter_AddRefs(locale)); NS_ENSURE_SUCCESS(rv, rv); nsAutoString localeName; rv = locale->GetCategory(NS_LITERAL_STRING(NSILOCALE_MESSAGE), localeName); NS_ENSURE_SUCCESS(rv, rv); printf("System Language is %s\n", NS_ConvertUTF16toUTF8(localeName).get());
var localeService = Components.classes["@mozilla.org/intl/nslocaleservice;1"] .getService(Components.interfaces.nsILocaleService); var locale = localeService.getSystemLocale(); var localeName = locale.getCategory("NSILOCALE_MESSAGES"); Components.utils.reportError(localeName);