Hi All, One big problem that we have with apps in FirefoxOS right now is that they are very strongly separated. This shows up in at least two ways:
1. Each app has its own cookie jar. So logging in to Facebook in one app means that you still can't use facebook account in another app. 2. It's impossible to link to another app. If app A contains <a href="http://app-b.com">, and the user has the App B app installed for which comes from app-b.com, that still won't open App B. Instead it will open the http://app-b.com url within app A. I.e. the UX will still make it look like App A is open, and we'll still use App A's cookie jar. Ben Francis and others have been pushing for quite a while that we need to fix this. I think we should try doing that for the 2.1 release since it will simplify several features that we're currently trying to implement for 2.1. At a recent B2G work week in Mountain View, both Ben [1] and I [2] showed presentations for how we can solve this. The two solutions ended up having a lot of overlap, so this proposal contains ideas from both. High-level overview of proposed solution: Add two fields to the application manifest: { "name": "AwesomeGame", ... "scope": ["http://awesomegame.com/*"], "open-in-app": ["http://awesomegamehelper.com/*"] } When the user is navigates, from any application, to a URL starting with any of the URLs in AwesomeGame's "scope", then the URL is opened within the AwesomeGame App. Any navigations from *within* AwesomeGame that falls inside either the "scope" or "open-in-app" stay within the app. Any other navigation is opened in the system default browser app, or inside another app if the URL is part of the other App's "scope". When a page "opens within AwesomeGame", that means that we both use AwesomeGame's cookie jar, as well as use UX which indicates that the user is currently using AwesomeGame, rather than simply browsing the web. Note that the above rules only affects top-level navigations. Contents in <iframe>s as well as sub-resources like images/script/css always uses the same cookie jar as its contained page. The low-level details: Both the "scope" and "open-in-app" manifest attributes are arrays of strings. These strings must end with "/*". Ignoring the ending "*", the strings must be valid URLs. But relative URLs are ok. The "scope" attribute is limited to be same-origin to the App's manifest. Any strings in the "scope" which are not same-origin with the manifest are ignored (we should probably output a warning in the error console whenever we detect this). The default value for "scope", if none is provided in the manifest, is the manifest's origin with a "*" appended at the end. The default value for "open-in-app" is the value of the "scope" attribute. We should probably use the value of the "scope" after any cross-origin "scope" values have been filtered, and the default "scope" have been added if needed. For a URL "to be part of" an App's "scope" or "open-in-app" means for it to match the prefixes in those attributes. Note that we should for now not bother doing any complex pattern matching. Hopefully prefixes will be enough. There are two things that can cause "a navigation" of a top-level context. A "top-level context" here is any page directly living inside a <iframe> opened by the system app. * Navigating an existing context. Such as using <a href="...">, <form action="..."> or setting document.location. * Opening a new context. Such as using window.open(url, "_blank") or using <a href="..." target="_blank"> When navigating an existing context, use the following algorithm: 1. If the current page is part of a "dialog" window, open the new page within that window, i.e. in the current app. 2. If the URL is part of the current context's App's "scope" or "open-in-app", open the new page within the current app. 3. If the URL is part of multiple other App's "scope", show an application picker to the user and allow the user to choose which of the two applications to use. 4. If the URL is part of another App's "scope", open the new page within that App. 5. Open the URL in the system browser. When opening a new context: 1. If the new context is a "dialog" context, create a new dialog window and open the URL there. 2. If the "target" of the navigation is "_blank" and the URL is not part of the current context's Apps' "scope", go to step 4. 3. If the URL is part of the current context's App's "scope" or "open-in-app", open the new page within the current app. 4. If the URL is part of multiple other App's "scope", show an application picker to the user and allow the user to choose which of the two applications to use. 5. If the URL is part of another App's "scope", open the new page within that App. 6. Open the URL in the system browser. Outstanding questions: I'm still not sure what to do UX-wise about URLs that the user navigates to URLs in an apps "open-in-app". Do those URLs show up in the rocket-bar history? If the user enters one of those, do we open them in the browser, or in whatever app they were previously opened in. I think for now we can probably simply open such URLs in the default browser. If that causes problems we can iterate and improve. Another question is how we deal with e.me apps. If the user has facebook installed, and e.me tries to open facebook, that means that the facebook URL likely will be part of the "scope" of the facebook app. It would be great to in this case simply open the facebook app, however that's a fairly large change so feels a bit scary. But definitely something we want to do long term. Implementation strategy: I think implementing this will require modifying docshell so that it detects if a navigation happens outside of what should be opened within the current mozbrowser iframe. If so, we should fire an event through the browser API which tells the system app to find an appropriate app to open the URL in. Or, if no such app exists, to open the URL as a default browser. [1] http://people.mozilla.org/~bfrancis/app_scope.pdf [2] https://docs.google.com/presentation/d/1GtOPvaOuwaE1sPCkeCgLfe6qYKzFjpOMJGE-XMMP4Sw/edit?usp=sharing / Jonas _______________________________________________ dev-b2g mailing list dev-b2g@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-b2g