Commit a6a97184 authored by Justin Lebar's avatar Justin Lebar
Browse files

Bug 714861 - Run <iframe mozbrowser> in a separate process (disabled by...

Bug 714861 - Run <iframe mozbrowser> in a separate process (disabled by default). r=cjones,bz,tn,smaug
parent 8fa462d9
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -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);
+68 −23
Original line number Original line Diff line number Diff line
@@ -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;
  }
  }


@@ -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;


@@ -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);
@@ -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);


@@ -1861,6 +1888,7 @@ nsFrameLoader::TryRemoteBrowser()
                          nsCaseInsensitiveStringComparator())) {
                          nsCaseInsensitiveStringComparator())) {
      return false;
      return false;
    }
    }
  }


  PRUint32 chromeFlags = 0;
  PRUint32 chromeFlags = 0;
  nsCOMPtr<nsIDocShellTreeOwner> parentOwner;
  nsCOMPtr<nsIDocShellTreeOwner> parentOwner;
@@ -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()
{
{
@@ -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));


+6 −0
Original line number Original line Diff line number Diff line
@@ -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.
+26 −6
Original line number Original line Diff line number Diff line
@@ -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"


@@ -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;
}
}




+2 −2
Original line number Original line Diff line number Diff line
@@ -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