Loading b2g/app/b2g.js +2 −1 Original line number Original line Diff line number Diff line Loading @@ -425,9 +425,10 @@ pref("browser.link.open_newwindow", 3); // 2: don't divert window.open with features // 2: don't divert window.open with features pref("browser.link.open_newwindow.restriction", 0); pref("browser.link.open_newwindow.restriction", 0); // Enable browser frame // Enable browser frames, but not OOP. pref("dom.mozBrowserFramesEnabled", true); pref("dom.mozBrowserFramesEnabled", true); pref("dom.mozBrowserFramesWhitelist", "http://homescreen.gaiamobile.org,http://browser.gaiamobile.org"); pref("dom.mozBrowserFramesWhitelist", "http://homescreen.gaiamobile.org,http://browser.gaiamobile.org"); pref("dom.ipc.tabs.disabled", true); // Temporary permission hack for WebSMS // Temporary permission hack for WebSMS pref("dom.sms.enabled", true); pref("dom.sms.enabled", true); Loading content/base/src/nsFrameLoader.cpp +68 −23 Original line number Original line Diff line number Diff line Loading @@ -457,8 +457,13 @@ nsFrameLoader::ReallyStartLoadingInternal() } } } } if (mRemoteBrowserShown || ShowRemoteFrame(nsIntSize(0, 0))) { // FIXME get error codes from child // FIXME get error codes from child mRemoteBrowser->LoadURL(mURIToLoad); mRemoteBrowser->LoadURL(mURIToLoad); } else { NS_WARNING("[nsFrameLoader] ReallyStartLoadingInternal tried but couldn't show remote browser.\n"); } return NS_OK; return NS_OK; } } Loading Loading @@ -912,6 +917,18 @@ nsFrameLoader::ShowRemoteFrame(const nsIntSize& size) // cross-process layers; need to figure out what behavior we really // cross-process layers; need to figure out what behavior we really // want here. For now, hack. // want here. For now, hack. if (!mRemoteBrowserShown) { if (!mRemoteBrowserShown) { if (!mOwnerContent || !mOwnerContent->GetCurrentDoc()) { return false; } nsRefPtr<layers::LayerManager> layerManager = nsContentUtils::LayerManagerForDocument(mOwnerContent->GetCurrentDoc()); if (!layerManager) { // This is just not going to work. return false; } mRemoteBrowser->Show(size); mRemoteBrowser->Show(size); mRemoteBrowserShown = true; mRemoteBrowserShown = true; Loading Loading @@ -1356,18 +1373,26 @@ nsFrameLoader::SetOwnerContent(Element* aContent) } } bool bool nsFrameLoader::ShouldUseRemoteProcess() nsFrameLoader::OwnerIsBrowserFrame() { { // Check for *disabled* multi-process first: environment, pref nsCOMPtr<nsIMozBrowserFrame> browserFrame = do_QueryInterface(mOwnerContent); // Then check for *enabled* multi-process attribute bool isBrowser = false; // Default is not-remote. if (browserFrame) { browserFrame->GetReallyIsBrowser(&isBrowser); } return isBrowser; } bool nsFrameLoader::ShouldUseRemoteProcess() { if (PR_GetEnv("MOZ_DISABLE_OOP_TABS") || if (PR_GetEnv("MOZ_DISABLE_OOP_TABS") || Preferences::GetBool("dom.ipc.tabs.disabled", false)) { Preferences::GetBool("dom.ipc.tabs.disabled", false)) { return false; return false; } } return (bool) mOwnerContent->AttrValueIs(kNameSpaceID_None, return OwnerIsBrowserFrame() || (bool) mOwnerContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::Remote, nsGkAtoms::Remote, nsGkAtoms::_true, nsGkAtoms::_true, eCaseMatters); eCaseMatters); Loading Loading @@ -1842,6 +1867,8 @@ nsFrameLoader::TryRemoteBrowser() nsCOMPtr<nsIDocShellTreeItem> parentAsItem(do_QueryInterface(parentAsWebNav)); nsCOMPtr<nsIDocShellTreeItem> parentAsItem(do_QueryInterface(parentAsWebNav)); // <iframe mozbrowser> gets to skip these checks. if (!OwnerIsBrowserFrame()) { PRInt32 parentType; PRInt32 parentType; parentAsItem->GetItemType(&parentType); parentAsItem->GetItemType(&parentType); Loading @@ -1861,6 +1888,7 @@ nsFrameLoader::TryRemoteBrowser() nsCaseInsensitiveStringComparator())) { nsCaseInsensitiveStringComparator())) { return false; return false; } } } PRUint32 chromeFlags = 0; PRUint32 chromeFlags = 0; nsCOMPtr<nsIDocShellTreeOwner> parentOwner; nsCOMPtr<nsIDocShellTreeOwner> parentOwner; Loading Loading @@ -2131,6 +2159,19 @@ nsFrameLoader::GetRootContentView(nsIContentView** aContentView) return NS_OK; return NS_OK; } } static already_AddRefed<nsIDocShell> GetRootDocShell(nsIDocument *aDocument) { nsCOMPtr<nsIWebNavigation> webNav = do_GetInterface(aDocument->GetWindow()); nsCOMPtr<nsIDocShellTreeItem> treeItem = do_QueryInterface(webNav); NS_ENSURE_TRUE(treeItem, NULL); nsCOMPtr<nsIDocShellTreeItem> rootItem; treeItem->GetRootTreeItem(getter_AddRefs(rootItem)); nsCOMPtr<nsIDocShell> rootDocShell = do_QueryInterface(rootItem); return rootDocShell.forget(); } nsresult nsresult nsFrameLoader::EnsureMessageManager() nsFrameLoader::EnsureMessageManager() { { Loading Loading @@ -2159,8 +2200,12 @@ nsFrameLoader::EnsureMessageManager() NS_ENSURE_STATE(cx); NS_ENSURE_STATE(cx); nsCOMPtr<nsIDOMChromeWindow> chromeWindow = nsCOMPtr<nsIDOMChromeWindow> chromeWindow = do_QueryInterface(mOwnerContent->OwnerDoc()->GetWindow()); do_QueryInterface(OwnerDoc()->GetWindow()); NS_ENSURE_STATE(chromeWindow); if (!chromeWindow) { nsCOMPtr<nsIDocShell> rootDocShell = GetRootDocShell(OwnerDoc()); nsCOMPtr<nsIDOMWindow> rootWindow = do_GetInterface(rootDocShell); chromeWindow = do_GetInterface(rootWindow); } nsCOMPtr<nsIChromeFrameMessageManager> parentManager; nsCOMPtr<nsIChromeFrameMessageManager> parentManager; chromeWindow->GetMessageManager(getter_AddRefs(parentManager)); chromeWindow->GetMessageManager(getter_AddRefs(parentManager)); Loading content/base/src/nsFrameLoader.h +6 −0 Original line number Original line Diff line number Diff line Loading @@ -295,6 +295,12 @@ private: bool ShouldUseRemoteProcess(); bool ShouldUseRemoteProcess(); /** * Is this a frameloader for a bona fide <iframe mozbrowser>? (I.e., does * the frame return true for nsIMozBrowserFrame::GetReallyIsBrowser()?) */ bool OwnerIsBrowserFrame(); /** /** * If we are an IPC frame, set mRemoteFrame. Otherwise, create and * If we are an IPC frame, set mRemoteFrame. Otherwise, create and * initialize mDocShell. * initialize mDocShell. Loading content/events/src/nsEventStateManager.cpp +26 −6 Original line number Original line Diff line number Diff line Loading @@ -100,6 +100,8 @@ #include "nsIDOMUIEvent.h" #include "nsIDOMUIEvent.h" #include "nsDOMDragEvent.h" #include "nsDOMDragEvent.h" #include "nsIDOMNSEditableElement.h" #include "nsIDOMNSEditableElement.h" #include "nsIDOMMozBrowserFrame.h" #include "nsIMozBrowserFrame.h" #include "nsCaret.h" #include "nsCaret.h" Loading Loading @@ -1701,12 +1703,30 @@ nsEventStateManager::DispatchCrossProcessEvent(nsEvent* aEvent, nsIFrameLoader* bool bool nsEventStateManager::IsRemoteTarget(nsIContent* target) { nsEventStateManager::IsRemoteTarget(nsIContent* target) { return target && if (!target) { (target->Tag() == nsGkAtoms::browser || return false; } // <browser/iframe remote=true> from XUL if ((target->Tag() == nsGkAtoms::browser || target->Tag() == nsGkAtoms::iframe) && target->Tag() == nsGkAtoms::iframe) && target->IsXUL() && target->IsXUL() && target->AttrValueIs(kNameSpaceID_None, nsGkAtoms::Remote, target->AttrValueIs(kNameSpaceID_None, nsGkAtoms::Remote, nsGkAtoms::_true, eIgnoreCase); nsGkAtoms::_true, eIgnoreCase)) { return true; } // <frame/iframe mozbrowser> nsCOMPtr<nsIMozBrowserFrame> browserFrame = do_QueryInterface(target); if (browserFrame) { bool isRemote = false; browserFrame->GetReallyIsBrowser(&isRemote); if (isRemote) { return true; } } return false; } } Loading dom/ipc/ContentChild.cpp +2 −2 Original line number Original line Diff line number Diff line Loading @@ -233,9 +233,9 @@ ConsoleListener::Observe(nsIConsoleMessage* aMessage) ContentChild* ContentChild::sSingleton; ContentChild* ContentChild::sSingleton; ContentChild::ContentChild() ContentChild::ContentChild() : mID(PRUint64(-1)) #ifdef ANDROID #ifdef ANDROID : mScreenSize(0, 0) , mScreenSize(0, 0) , mID(PRUint64(-1)) #endif #endif { { // This process is a content process, so it's clearly running in // This process is a content process, so it's clearly running in Loading Loading
b2g/app/b2g.js +2 −1 Original line number Original line Diff line number Diff line Loading @@ -425,9 +425,10 @@ pref("browser.link.open_newwindow", 3); // 2: don't divert window.open with features // 2: don't divert window.open with features pref("browser.link.open_newwindow.restriction", 0); pref("browser.link.open_newwindow.restriction", 0); // Enable browser frame // Enable browser frames, but not OOP. pref("dom.mozBrowserFramesEnabled", true); pref("dom.mozBrowserFramesEnabled", true); pref("dom.mozBrowserFramesWhitelist", "http://homescreen.gaiamobile.org,http://browser.gaiamobile.org"); pref("dom.mozBrowserFramesWhitelist", "http://homescreen.gaiamobile.org,http://browser.gaiamobile.org"); pref("dom.ipc.tabs.disabled", true); // Temporary permission hack for WebSMS // Temporary permission hack for WebSMS pref("dom.sms.enabled", true); pref("dom.sms.enabled", true); Loading
content/base/src/nsFrameLoader.cpp +68 −23 Original line number Original line Diff line number Diff line Loading @@ -457,8 +457,13 @@ nsFrameLoader::ReallyStartLoadingInternal() } } } } if (mRemoteBrowserShown || ShowRemoteFrame(nsIntSize(0, 0))) { // FIXME get error codes from child // FIXME get error codes from child mRemoteBrowser->LoadURL(mURIToLoad); mRemoteBrowser->LoadURL(mURIToLoad); } else { NS_WARNING("[nsFrameLoader] ReallyStartLoadingInternal tried but couldn't show remote browser.\n"); } return NS_OK; return NS_OK; } } Loading Loading @@ -912,6 +917,18 @@ nsFrameLoader::ShowRemoteFrame(const nsIntSize& size) // cross-process layers; need to figure out what behavior we really // cross-process layers; need to figure out what behavior we really // want here. For now, hack. // want here. For now, hack. if (!mRemoteBrowserShown) { if (!mRemoteBrowserShown) { if (!mOwnerContent || !mOwnerContent->GetCurrentDoc()) { return false; } nsRefPtr<layers::LayerManager> layerManager = nsContentUtils::LayerManagerForDocument(mOwnerContent->GetCurrentDoc()); if (!layerManager) { // This is just not going to work. return false; } mRemoteBrowser->Show(size); mRemoteBrowser->Show(size); mRemoteBrowserShown = true; mRemoteBrowserShown = true; Loading Loading @@ -1356,18 +1373,26 @@ nsFrameLoader::SetOwnerContent(Element* aContent) } } bool bool nsFrameLoader::ShouldUseRemoteProcess() nsFrameLoader::OwnerIsBrowserFrame() { { // Check for *disabled* multi-process first: environment, pref nsCOMPtr<nsIMozBrowserFrame> browserFrame = do_QueryInterface(mOwnerContent); // Then check for *enabled* multi-process attribute bool isBrowser = false; // Default is not-remote. if (browserFrame) { browserFrame->GetReallyIsBrowser(&isBrowser); } return isBrowser; } bool nsFrameLoader::ShouldUseRemoteProcess() { if (PR_GetEnv("MOZ_DISABLE_OOP_TABS") || if (PR_GetEnv("MOZ_DISABLE_OOP_TABS") || Preferences::GetBool("dom.ipc.tabs.disabled", false)) { Preferences::GetBool("dom.ipc.tabs.disabled", false)) { return false; return false; } } return (bool) mOwnerContent->AttrValueIs(kNameSpaceID_None, return OwnerIsBrowserFrame() || (bool) mOwnerContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::Remote, nsGkAtoms::Remote, nsGkAtoms::_true, nsGkAtoms::_true, eCaseMatters); eCaseMatters); Loading Loading @@ -1842,6 +1867,8 @@ nsFrameLoader::TryRemoteBrowser() nsCOMPtr<nsIDocShellTreeItem> parentAsItem(do_QueryInterface(parentAsWebNav)); nsCOMPtr<nsIDocShellTreeItem> parentAsItem(do_QueryInterface(parentAsWebNav)); // <iframe mozbrowser> gets to skip these checks. if (!OwnerIsBrowserFrame()) { PRInt32 parentType; PRInt32 parentType; parentAsItem->GetItemType(&parentType); parentAsItem->GetItemType(&parentType); Loading @@ -1861,6 +1888,7 @@ nsFrameLoader::TryRemoteBrowser() nsCaseInsensitiveStringComparator())) { nsCaseInsensitiveStringComparator())) { return false; return false; } } } PRUint32 chromeFlags = 0; PRUint32 chromeFlags = 0; nsCOMPtr<nsIDocShellTreeOwner> parentOwner; nsCOMPtr<nsIDocShellTreeOwner> parentOwner; Loading Loading @@ -2131,6 +2159,19 @@ nsFrameLoader::GetRootContentView(nsIContentView** aContentView) return NS_OK; return NS_OK; } } static already_AddRefed<nsIDocShell> GetRootDocShell(nsIDocument *aDocument) { nsCOMPtr<nsIWebNavigation> webNav = do_GetInterface(aDocument->GetWindow()); nsCOMPtr<nsIDocShellTreeItem> treeItem = do_QueryInterface(webNav); NS_ENSURE_TRUE(treeItem, NULL); nsCOMPtr<nsIDocShellTreeItem> rootItem; treeItem->GetRootTreeItem(getter_AddRefs(rootItem)); nsCOMPtr<nsIDocShell> rootDocShell = do_QueryInterface(rootItem); return rootDocShell.forget(); } nsresult nsresult nsFrameLoader::EnsureMessageManager() nsFrameLoader::EnsureMessageManager() { { Loading Loading @@ -2159,8 +2200,12 @@ nsFrameLoader::EnsureMessageManager() NS_ENSURE_STATE(cx); NS_ENSURE_STATE(cx); nsCOMPtr<nsIDOMChromeWindow> chromeWindow = nsCOMPtr<nsIDOMChromeWindow> chromeWindow = do_QueryInterface(mOwnerContent->OwnerDoc()->GetWindow()); do_QueryInterface(OwnerDoc()->GetWindow()); NS_ENSURE_STATE(chromeWindow); if (!chromeWindow) { nsCOMPtr<nsIDocShell> rootDocShell = GetRootDocShell(OwnerDoc()); nsCOMPtr<nsIDOMWindow> rootWindow = do_GetInterface(rootDocShell); chromeWindow = do_GetInterface(rootWindow); } nsCOMPtr<nsIChromeFrameMessageManager> parentManager; nsCOMPtr<nsIChromeFrameMessageManager> parentManager; chromeWindow->GetMessageManager(getter_AddRefs(parentManager)); chromeWindow->GetMessageManager(getter_AddRefs(parentManager)); Loading
content/base/src/nsFrameLoader.h +6 −0 Original line number Original line Diff line number Diff line Loading @@ -295,6 +295,12 @@ private: bool ShouldUseRemoteProcess(); bool ShouldUseRemoteProcess(); /** * Is this a frameloader for a bona fide <iframe mozbrowser>? (I.e., does * the frame return true for nsIMozBrowserFrame::GetReallyIsBrowser()?) */ bool OwnerIsBrowserFrame(); /** /** * If we are an IPC frame, set mRemoteFrame. Otherwise, create and * If we are an IPC frame, set mRemoteFrame. Otherwise, create and * initialize mDocShell. * initialize mDocShell. Loading
content/events/src/nsEventStateManager.cpp +26 −6 Original line number Original line Diff line number Diff line Loading @@ -100,6 +100,8 @@ #include "nsIDOMUIEvent.h" #include "nsIDOMUIEvent.h" #include "nsDOMDragEvent.h" #include "nsDOMDragEvent.h" #include "nsIDOMNSEditableElement.h" #include "nsIDOMNSEditableElement.h" #include "nsIDOMMozBrowserFrame.h" #include "nsIMozBrowserFrame.h" #include "nsCaret.h" #include "nsCaret.h" Loading Loading @@ -1701,12 +1703,30 @@ nsEventStateManager::DispatchCrossProcessEvent(nsEvent* aEvent, nsIFrameLoader* bool bool nsEventStateManager::IsRemoteTarget(nsIContent* target) { nsEventStateManager::IsRemoteTarget(nsIContent* target) { return target && if (!target) { (target->Tag() == nsGkAtoms::browser || return false; } // <browser/iframe remote=true> from XUL if ((target->Tag() == nsGkAtoms::browser || target->Tag() == nsGkAtoms::iframe) && target->Tag() == nsGkAtoms::iframe) && target->IsXUL() && target->IsXUL() && target->AttrValueIs(kNameSpaceID_None, nsGkAtoms::Remote, target->AttrValueIs(kNameSpaceID_None, nsGkAtoms::Remote, nsGkAtoms::_true, eIgnoreCase); nsGkAtoms::_true, eIgnoreCase)) { return true; } // <frame/iframe mozbrowser> nsCOMPtr<nsIMozBrowserFrame> browserFrame = do_QueryInterface(target); if (browserFrame) { bool isRemote = false; browserFrame->GetReallyIsBrowser(&isRemote); if (isRemote) { return true; } } return false; } } Loading
dom/ipc/ContentChild.cpp +2 −2 Original line number Original line Diff line number Diff line Loading @@ -233,9 +233,9 @@ ConsoleListener::Observe(nsIConsoleMessage* aMessage) ContentChild* ContentChild::sSingleton; ContentChild* ContentChild::sSingleton; ContentChild::ContentChild() ContentChild::ContentChild() : mID(PRUint64(-1)) #ifdef ANDROID #ifdef ANDROID : mScreenSize(0, 0) , mScreenSize(0, 0) , mID(PRUint64(-1)) #endif #endif { { // This process is a content process, so it's clearly running in // This process is a content process, so it's clearly running in Loading