User:Torisugari
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);