Mozilla Home
Privacy
Cookies
Legal
Bugzilla
Browse
Advanced Search
New Bug
Reports
Documentation
Log In
Log In with GitHub
or
Remember me
Browse
Advanced Search
New Bug
Reports
Documentation
Attachment 471181 Details for
Bug 449734
[patch]
Part 1, rev. 3
patch3.diff (text/plain), 20.53 KB, created by
Mats Palmgren (inactive)
(
hide
)
Description:
Part 1, rev. 3
Filename:
MIME Type:
Creator:
Mats Palmgren (inactive)
Size:
20.53 KB
patch
obsolete
>diff --git a/browser/base/content/test/Makefile.in b/browser/base/content/test/Makefile.in >--- a/browser/base/content/test/Makefile.in >+++ b/browser/base/content/test/Makefile.in >@@ -173,16 +173,17 @@ _BROWSER_FILES = \ > browser_popupUI.js \ > browser_relatedTabs.js \ > browser_sanitize-passwordDisabledHosts.js \ > browser_sanitize-sitepermissions.js \ > browser_sanitize-timespans.js \ > browser_sanitizeDialog.js \ > browser_scope.js \ > browser_selectTabAtIndex.js \ >+ browser_tab_dragdrop.js \ > browser_tabfocus.js \ > browser_tabs_owner.js \ > browser_visibleTabs.js \ > browser_visibleTabs_contextMenu.js \ > browser_visibleTabs_bookmarkAllPages.js \ > browser_visibleTabs_bookmarkAllTabs.js \ > browser_visibleTabs_tabPreview.js \ > discovery.html \ >diff --git a/browser/base/content/test/browser_tab_dragdrop.js b/browser/base/content/test/browser_tab_dragdrop.js >new file mode 100644 >--- /dev/null >+++ b/browser/base/content/test/browser_tab_dragdrop.js >@@ -0,0 +1,73 @@ >+function test() >+{ >+ var embed = '<embed type="application/x-test" allowscriptaccess="always" allowfullscreen="true" wmode="window" width="640" height="480"></embed>' >+ >+ waitForExplicitFinish(); >+ >+ // create a few tabs >+ var tabs = [ >+ gBrowser.tabs[0], >+ gBrowser.addTab("about:blank", {skipAnimation: true}), >+ gBrowser.addTab("about:blank", {skipAnimation: true}), >+ gBrowser.addTab("about:blank", {skipAnimation: true}), >+ gBrowser.addTab("about:blank", {skipAnimation: true}) >+ ]; >+ >+ function setLocation(i, url) { >+ gBrowser.getBrowserForTab(tabs[i]).contentWindow.location = url; >+ } >+ function moveTabTo(a, b) { >+ gBrowser.swapBrowsersAndCloseOther(gBrowser.tabs[b], gBrowser.tabs[a]); >+ } >+ function test1() { >+ moveTabTo(2, 3); // now: 0 1 2 4 >+ is(gBrowser.tabs[1], tabs[1], "tab1"); >+ is(gBrowser.tabs[2], tabs[3], "tab3"); >+ >+ var plugin = gBrowser.getBrowserForTab(tabs[4]).docShell.contentViewer.DOMDocument.wrappedJSObject.body.firstChild; >+ var tab4_plugin_object = plugin.getObjectValue(); >+ >+ gBrowser.selectedTab = gBrowser.tabs[2]; >+ moveTabTo(3, 2); // now: 0 1 4 >+ gBrowser.selectedTab = tabs[4]; >+ plugin = gBrowser.getBrowserForTab(gBrowser.tabs[2]).docShell.contentViewer.DOMDocument.wrappedJSObject.body.firstChild; >+ ok(plugin && plugin.checkObjectValue(tab4_plugin_object), "same plugin instance"); >+ is(gBrowser.tabs[1], tabs[1], "tab1"); >+ is(gBrowser.tabs[2], tabs[3], "tab4"); >+ >+ moveTabTo(2, 1); // now: 0 4 >+ is(gBrowser.tabs[1], tabs[1], "tab1"); >+ plugin = gBrowser.getBrowserForTab(gBrowser.tabs[1]).docShell.contentViewer.DOMDocument.wrappedJSObject.body.firstChild; >+ ok(plugin && plugin.checkObjectValue(tab4_plugin_object), "same plugin instance"); >+ >+ moveTabTo(0, 1); // now: 0 >+ is(gBrowser.tabs[0], tabs[1], "tab0"); >+ ok(!gBrowser.tabs[0].docShell, "tab0 has no docshell"); >+ is(gBrowser.getBrowserForTab(gBrowser.tabs[0]).contentWindow.location, "about:blank", "tab0 uri"); >+ >+ finish(); >+ } >+ >+ var loads = 0; >+ function waitForLoad(tab) { >+ gBrowser.getBrowserForTab(gBrowser.tabs[tab]).removeEventListener("load", arguments.callee, true); >+ ++loads; >+ if (loads == tabs.length - 1) { >+ executeSoon(test1); >+ } >+ } >+ >+ function fn(f, arg) { >+ return function () { return f(arg); }; >+ } >+ for (var i = 1; i < tabs.length; ++i) { >+ gBrowser.getBrowserForTab(tabs[i]).addEventListener("load", fn(waitForLoad,i), true); >+ } >+ >+ setLocation(1, "data:text/html,<title>tab1</title><body>tab1<iframe>"); >+ setLocation(2, "data:text/plain,tab2"); >+ setLocation(3, "data:text/html,<title>tab3</title><body>tab3<iframe>"); >+ setLocation(4, "data:text/html,<body>"+embed); >+ gBrowser.selectedTab = tabs[3]; >+ >+} >diff --git a/content/base/src/nsFrameLoader.cpp b/content/base/src/nsFrameLoader.cpp >--- a/content/base/src/nsFrameLoader.cpp >+++ b/content/base/src/nsFrameLoader.cpp >@@ -1081,25 +1081,25 @@ nsFrameLoader::SwapWithOtherLoader(nsFra > do_QueryInterface(otherHistory); > if (ourInternalHistory) { > ourInternalHistory->EvictAllContentViewers(); > } > if (otherInternalHistory) { > otherInternalHistory->EvictAllContentViewers(); > } > >- // We shouldn't have changed frames, but be really careful about it >- if (ourFrame == ourContent->GetPrimaryFrame() && >- otherFrame == otherContent->GetPrimaryFrame()) { >- ourFrameFrame->EndSwapDocShells(otherFrame); >- } >+ NS_ASSERTION(ourFrame == ourContent->GetPrimaryFrame() && >+ otherFrame == otherContent->GetPrimaryFrame(), >+ "changed primary frame"); >+ >+ ourFrameFrame->EndSwapDocShells(otherFrame); > > ourParentDocument->FlushPendingNotifications(Flush_Layout); > otherParentDocument->FlushPendingNotifications(Flush_Layout); >- >+ > FirePageShowEvent(ourTreeItem, otherChromeEventHandler, PR_TRUE); > FirePageShowEvent(otherTreeItem, ourChromeEventHandler, PR_TRUE); > > mInSwap = aOther->mInSwap = PR_FALSE; > return NS_OK; > } > > void >diff --git a/layout/base/FrameLayerBuilder.h b/layout/base/FrameLayerBuilder.h >--- a/layout/base/FrameLayerBuilder.h >+++ b/layout/base/FrameLayerBuilder.h >@@ -238,16 +238,24 @@ public: > * Given a frame and a display item key that uniquely identifies a > * display item for the frame, find the layer that was last used to > * render that display item. Returns null if there is no such layer. > * This could be a dedicated layer for the display item, or a ThebesLayer > * that renders many display items. > */ > Layer* GetOldLayerFor(nsIFrame* aFrame, PRUint32 aDisplayItemKey); > >+ /** >+ * Destroy any stored DisplayItemDataProperty for aFrame. >+ */ >+ static void DestroyDisplayItemDataFor(nsIFrame* aFrame) >+ { >+ aFrame->Properties().Delete(DisplayItemDataProperty()); >+ } >+ > protected: > /** > * We store an array of these for each frame that is associated with > * one or more retained layers. Each DisplayItemData records the layer > * used to render one of the frame's display items. > */ > class DisplayItemData { > public: >diff --git a/layout/generic/nsObjectFrame.cpp b/layout/generic/nsObjectFrame.cpp >--- a/layout/generic/nsObjectFrame.cpp >+++ b/layout/generic/nsObjectFrame.cpp >@@ -23,17 +23,17 @@ > * Contributor(s): > * Pierre Phaneuf <pp@ludusdesign.com> > * Jacek Piskozub <piskozub@iopan.gda.pl> > * Leon Sha <leon.sha@sun.com> > * Roland Mainz <roland.mainz@informatik.med.uni-giessen.de> > * Robert O'Callahan <roc+moz@cs.cmu.edu> > * Christian Biesinger <cbiesinger@web.de> > * Josh Aas <josh@mozilla.com> >- * Mats Palmgren <mats.palmgren@bredband.net> >+ * Mats Palmgren <matspal@gmail.com> > * > * Alternatively, the contents of this file may be used under the terms of > * either of the GNU General Public License Version 2 or later (the "GPL"), > * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), > * in which case the provisions of the GPL or the LGPL are applicable instead > * of those above. If you wish to allow use of your version of this file only > * under the terms of either the GPL or the LGPL, and not to allow others to > * use your version of this file under the terms of the MPL, indicate your >@@ -2418,16 +2418,63 @@ nsObjectFrame::GetNextObjectFrame(nsPres > if (outFrame) > return outFrame; > child = child->GetNextSibling(); > } > > return nsnull; > } > >+/*static*/ void >+nsObjectFrame::BeginSwapDocShells(nsIContent* aContent, void*) >+{ >+ NS_PRECONDITION(aContent, ""); >+ >+ // This function is called from a document content enumerator so we need >+ // to filter out the nsObjectFrames and ignore the rest. >+ nsIObjectFrame* obj = do_QueryFrame(aContent->GetPrimaryFrame()); >+ if (!obj) >+ return; >+ >+ nsObjectFrame* objectFrame = static_cast<nsObjectFrame*>(obj); >+ NS_ASSERTION(!objectFrame->mWidget || objectFrame->mWidget->GetParent(), >+ "Plugin windows must not be toplevel"); >+ nsRootPresContext* rootPC = objectFrame->PresContext()->GetRootPresContext(); >+ NS_ASSERTION(rootPC, "unable to unregister the plugin frame"); >+ rootPC->UnregisterPluginForGeometryUpdates(objectFrame); >+} >+ >+/*static*/ void >+nsObjectFrame::EndSwapDocShells(nsIContent* aContent, void*) >+{ >+ NS_PRECONDITION(aContent, ""); >+ >+ // This function is called from a document content enumerator so we need >+ // to filter out the nsObjectFrames and ignore the rest. >+ nsIObjectFrame* obj = do_QueryFrame(aContent->GetPrimaryFrame()); >+ if (!obj) >+ return; >+ >+ nsObjectFrame* objectFrame = static_cast<nsObjectFrame*>(obj); >+ nsRootPresContext* rootPC = objectFrame->PresContext()->GetRootPresContext(); >+ NS_ASSERTION(rootPC, "unable to register the plugin frame"); >+ nsIWidget* widget = objectFrame->GetWidget(); >+ if (widget) { >+ // Reparent the widget. >+ nsIWidget* parent = >+ rootPC->PresShell()->GetRootFrame()->GetNearestWidget(); >+ widget->SetParent(parent); >+ objectFrame->CallSetWindow(); >+ >+ // Register for geometry updates and make a request. >+ rootPC->RegisterPluginForGeometryUpdates(objectFrame); >+ rootPC->RequestUpdatePluginGeometry(objectFrame); >+ } >+} >+ > nsIFrame* > NS_NewObjectFrame(nsIPresShell* aPresShell, nsStyleContext* aContext) > { > return new (aPresShell) nsObjectFrame(aContext); > } > > NS_IMPL_FRAMEARENA_HELPERS(nsObjectFrame) > >diff --git a/layout/generic/nsObjectFrame.h b/layout/generic/nsObjectFrame.h >--- a/layout/generic/nsObjectFrame.h >+++ b/layout/generic/nsObjectFrame.h >@@ -157,16 +157,29 @@ public: > > //local methods > nsresult CreateWidget(nscoord aWidth, nscoord aHeight, PRBool aViewOnly); > > // for a given aRoot, this walks the frame tree looking for the next outFrame > static nsIObjectFrame* GetNextObjectFrame(nsPresContext* aPresContext, > nsIFrame* aRoot); > >+ /** >+ * If aContent has a nsObjectFrame, then prepare it for a DocShell swap. >+ * @see nsSubDocumentFrame::BeginSwapDocShells. >+ * There will be a call to EndSwapDocShells after we were moved to the >+ * new view tree. >+ */ >+ static void BeginSwapDocShells(nsIContent* aContent, void*); >+ /** >+ * If aContent has a nsObjectFrame, then set it up after a DocShell swap. >+ * @see nsSubDocumentFrame::EndSwapDocShells. >+ */ >+ static void EndSwapDocShells(nsIContent* aContent, void*); >+ > protected: > nsObjectFrame(nsStyleContext* aContext); > virtual ~nsObjectFrame(); > > // NOTE: This frame class does not inherit from |nsLeafFrame|, so > // this is not a virtual method implementation. > void GetDesiredSize(nsPresContext* aPresContext, > const nsHTMLReflowState& aReflowState, >diff --git a/layout/generic/nsSubDocumentFrame.cpp b/layout/generic/nsSubDocumentFrame.cpp >--- a/layout/generic/nsSubDocumentFrame.cpp >+++ b/layout/generic/nsSubDocumentFrame.cpp >@@ -17,16 +17,17 @@ > * The Initial Developer of the Original Code is > * Netscape Communications Corporation. > * Portions created by the Initial Developer are Copyright (C) 1998 > * the Initial Developer. All Rights Reserved. > * > * Contributor(s): > * Travis Bogard <travis@netscape.com> > * HÃkan Waara <hwaara@chello.se> >+ * Mats Palmgren <matspal@gmail.com> > * > * Alternatively, the contents of this file may be used under the terms of > * either of the GNU General Public License Version 2 or later (the "GPL"), > * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), > * in which case the provisions of the GPL or the LGPL are applicable instead > * of those above. If you wish to allow use of your version of this file only > * under the terms of either the GPL or the LGPL, and not to allow others to > * use your version of this file under the terms of the MPL, indicate your >@@ -82,27 +83,41 @@ > #include "nsIDOMDocument.h" > #include "nsIRenderingContext.h" > #include "nsIDOMNSHTMLDocument.h" > #include "nsDisplayList.h" > #include "nsUnicharUtils.h" > #include "nsIScrollableFrame.h" > #include "nsIObjectLoadingContent.h" > #include "nsLayoutUtils.h" >+#include "FrameLayerBuilder.h" >+#include "nsObjectFrame.h" > > #ifdef MOZ_XUL > #include "nsXULPopupManager.h" > #endif > > // For Accessibility > #ifdef ACCESSIBILITY > #include "nsIAccessibilityService.h" > #endif > #include "nsIServiceManager.h" > >+using namespace mozilla; >+ >+static nsIDocument* >+GetDocumentFromView(nsIView* aView) >+{ >+ NS_PRECONDITION(aView, ""); >+ >+ nsIFrame* f = static_cast<nsIFrame*>(aView->GetClientData()); >+ nsIPresShell* ps = f ? f->PresContext()->PresShell() : nsnull; >+ return ps ? ps->GetDocument() : nsnull; >+} >+ > class AsyncFrameInit; > > nsSubDocumentFrame::nsSubDocumentFrame(nsStyleContext* aContext) > : nsLeafFrame(aContext) > , mIsInline(PR_FALSE) > , mPostedReflowCallback(PR_FALSE) > , mDidCreateDoc(PR_FALSE) > , mCallingShow(PR_FALSE) >@@ -161,17 +176,16 @@ nsSubDocumentFrame::Init(nsIContent* > // canvas) when it really needs to have this frame's view as its > // parent. So, create this frame's view right away, whether we > // really need it or not, and the inner view will get it as the > // parent. > if (!HasView()) { > rv = nsHTMLContainerFrame::CreateViewForFrame(this, PR_TRUE); > NS_ENSURE_SUCCESS(rv, rv); > } >- nsIView* view = GetView(); > > // Set the primary frame now so that > // DocumentViewerImpl::FindContainerView called by ShowViewer below > // can find it if necessary. > aContent->SetPrimaryFrame(this); > > nsContentUtils::AddScriptRunner(new AsyncFrameInit(this)); > return NS_OK; >@@ -781,44 +795,146 @@ nsresult > nsSubDocumentFrame::GetDocShell(nsIDocShell **aDocShell) > { > *aDocShell = nsnull; > > NS_ENSURE_STATE(FrameLoader()); > return mFrameLoader->GetDocShell(aDocShell); > } > >+static void >+DestroyDisplayItemDataForFrames(nsIFrame* aFrame) >+{ >+ FrameLayerBuilder::DestroyDisplayItemDataFor(aFrame); >+ >+ PRInt32 listIndex = 0; >+ nsIAtom* childList = nsnull; >+ do { >+ nsIFrame* child = aFrame->GetFirstChild(childList); >+ while (child) { >+ DestroyDisplayItemDataForFrames(child); >+ child = child->GetNextSibling(); >+ } >+ childList = aFrame->GetAdditionalChildListName(listIndex++); >+ } while (childList); >+} >+ >+static PRBool >+BeginSwapDocShellsForDocument(nsIDocument* aDocument, void*) >+{ >+ NS_PRECONDITION(aDocument, ""); >+ >+ nsIPresShell* shell = aDocument->GetShell(); >+ nsIFrame* rootFrame = shell ? shell->GetRootFrame() : nsnull; >+ if (rootFrame) { >+ ::DestroyDisplayItemDataForFrames(rootFrame); >+ } >+ aDocument->EnumerateFreezableElements( >+ nsObjectFrame::BeginSwapDocShells, nsnull); >+ aDocument->EnumerateSubDocuments(BeginSwapDocShellsForDocument, nsnull); >+ return PR_TRUE; >+} >+ >+static nsIView* >+BeginSwapDocShellsForViews(nsIView* aSibling) >+{ >+ // Collect the removed sibling views in reverse order in 'removedViews'. >+ nsIView* removedViews = nsnull; >+ while (aSibling) { >+ nsIDocument* doc = ::GetDocumentFromView(aSibling); >+ if (doc) { >+ ::BeginSwapDocShellsForDocument(doc, nsnull); >+ } >+ nsIView* next = aSibling->GetNextSibling(); >+ aSibling->GetViewManager()->RemoveChild(aSibling); >+ aSibling->SetNextSibling(removedViews); >+ removedViews = aSibling; >+ aSibling = next; >+ } >+ return removedViews; >+} >+ >+static void >+InsertViewsInReverseOrder(nsIView* aSibling, nsIView* aParent) >+{ >+ NS_PRECONDITION(aParent, ""); >+ NS_PRECONDITION(!aParent->GetFirstChild(), "inserting into non-empty list"); >+ >+ nsIViewManager* vm = aParent->GetViewManager(); >+ while (aSibling) { >+ nsIView* next = aSibling->GetNextSibling(); >+ aSibling->SetNextSibling(nsnull); >+ // PR_TRUE means 'after' in document order which is 'before' in view order, >+ // so this call prepends the child, thus reversing the siblings as we go. >+ vm->InsertChild(aParent, aSibling, nsnull, PR_TRUE); >+ aSibling = next; >+ } >+} >+ > nsresult > nsSubDocumentFrame::BeginSwapDocShells(nsIFrame* aOther) > { > if (!aOther || aOther->GetType() != nsGkAtoms::subDocumentFrame) { > return NS_ERROR_NOT_IMPLEMENTED; > } > > nsSubDocumentFrame* other = static_cast<nsSubDocumentFrame*>(aOther); > if (!mFrameLoader || !mDidCreateDoc || mCallingShow || > !other->mFrameLoader || !other->mDidCreateDoc) { > return NS_ERROR_NOT_IMPLEMENTED; > } > >- HideViewer(); >- other->HideViewer(); >+ if (mInnerView && other->mInnerView) { >+ nsIView* ourSubdocViews = mInnerView->GetFirstChild(); >+ nsIView* ourRemovedViews = ::BeginSwapDocShellsForViews(ourSubdocViews); >+ nsIView* otherSubdocViews = other->mInnerView->GetFirstChild(); >+ nsIView* otherRemovedViews = ::BeginSwapDocShellsForViews(otherSubdocViews); > >+ ::InsertViewsInReverseOrder(ourRemovedViews, other->mInnerView); >+ ::InsertViewsInReverseOrder(otherRemovedViews, mInnerView); >+ } > mFrameLoader.swap(other->mFrameLoader); > return NS_OK; > } > >+static PRBool >+EndSwapDocShellsForDocument(nsIDocument* aDocument, void*) >+{ >+ NS_PRECONDITION(aDocument, ""); >+ >+ aDocument->EnumerateFreezableElements( >+ nsObjectFrame::EndSwapDocShells, nsnull); >+ aDocument->EnumerateSubDocuments(EndSwapDocShellsForDocument, nsnull); >+ return PR_TRUE; >+} >+ >+static void >+EndSwapDocShellsForViews(nsIView* aSibling) >+{ >+ for ( ; aSibling; aSibling = aSibling->GetNextSibling()) { >+ nsIDocument* doc = ::GetDocumentFromView(aSibling); >+ if (doc) { >+ ::EndSwapDocShellsForDocument(doc, nsnull); >+ } >+ } >+} >+ > void > nsSubDocumentFrame::EndSwapDocShells(nsIFrame* aOther) > { > nsSubDocumentFrame* other = static_cast<nsSubDocumentFrame*>(aOther); > nsWeakFrame weakThis(this); > nsWeakFrame weakOther(aOther); >- ShowViewer(); >- other->ShowViewer(); >+ >+ if (mInnerView) { >+ ::EndSwapDocShellsForViews(mInnerView->GetFirstChild()); >+ } >+ if (other->mInnerView) { >+ ::EndSwapDocShellsForViews(other->mInnerView->GetFirstChild()); >+ } > > // Now make sure we reflow both frames, in case their contents > // determine their size. > // And repaint them, for good measure, in case there's nothing > // interesting that happens during reflow. > if (weakThis.IsAlive()) { > PresContext()->PresShell()-> > FrameNeedsReflow(this, nsIPresShell::eTreeChange, NS_FRAME_IS_DIRTY); >diff --git a/view/public/nsIView.h b/view/public/nsIView.h >--- a/view/public/nsIView.h >+++ b/view/public/nsIView.h >@@ -243,16 +243,19 @@ public: > */ > nsIView* GetFirstChild() const { return reinterpret_cast<nsIView*>(mFirstChild); } > > /** > * Called to query the next sibling of the view. > * @result view's next sibling > */ > nsIView* GetNextSibling() const { return reinterpret_cast<nsIView*>(mNextSibling); } >+ void SetNextSibling(nsIView *aSibling) { >+ mNextSibling = reinterpret_cast<nsView*>(aSibling); >+ } > > /** > * Set the view's link to client owned data. > * @param aData - data to associate with view. nsnull to disassociate > */ > void SetClientData(void *aData) { mClientData = aData; } > > /** >diff --git a/widget/src/gtk2/nsWindow.cpp b/widget/src/gtk2/nsWindow.cpp >--- a/widget/src/gtk2/nsWindow.cpp >+++ b/widget/src/gtk2/nsWindow.cpp >@@ -16,17 +16,17 @@ > * > * The Original Code is mozilla.org code. > * > * The Initial Developer of the Original Code is Christopher Blizzard > * <blizzard@mozilla.org>. Portions created by the Initial Developer > * are Copyright (C) 2001 the Initial Developer. All Rights Reserved. > * > * Contributor(s): >- * Mats Palmgren <mats.palmgren@bredband.net> >+ * Mats Palmgren <matspal@gmail.com> > * Masayuki Nakano <masayuki@d-toybox.com> > * > * Alternatively, the contents of this file may be used under the terms of > * either the GNU General Public License Version 2 or later (the "GPL"), or > * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), > * in which case the provisions of the GPL or the LGPL are applicable instead > * of those above. If you wish to allow use of your version of this file only > * under the terms of either the GPL or the LGPL, and not to allow others to >@@ -885,17 +885,17 @@ nsWindow::SetParent(nsIWidget *aNewParen > Destroy(); > } else { > if (newContainer != oldContainer) { > NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(newParentWindow)->destroyed, > "destroyed GdkWindow with widget"); > SetWidgetForHierarchy(mGdkWindow, oldContainer, newContainer); > } > >- gdk_window_reparent(mGdkWindow, newParentWindow, 0, 0); >+ gdk_window_reparent(mGdkWindow, newParentWindow, mBounds.x, mBounds.y); > } > > PRBool parentHasMappedToplevel = > newParent && newParent->mHasMappedToplevel; > if (mHasMappedToplevel != parentHasMappedToplevel) { > SetHasMappedToplevel(parentHasMappedToplevel); > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Flags:
roc
: review+
Actions:
View
|
Diff
|
Review
Attachments on
bug 449734
:
469874
|
470799
| 471181 |
471532
|
472658
|
473812
|
474470
|
474471
|
474472
|
475510
|
476221
|
476222