Nothing Special »
Address
:
[go:
up one dir
,
main page
]
Include Form
Remove Scripts
Accept Cookies
Show Images
Show Referer
Rotate13
Base64
Strip Meta
Strip Title
Session Cookies
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 456279 Details for
Bug 570341
[patch]
Implementation of window.mozPerformance.timing
timing_20100707.diff (text/plain), 38.68 KB, created by
Sergey Novikov
(
hide
)
Description:
Implementation of window.mozPerformance.timing
Filename:
MIME Type:
Creator:
Sergey Novikov
Size:
38.68 KB
patch
obsolete
># HG changeset patch ># User Sergey Novikov <sergeyn@google.com> ># Date 1278517753 -7200 ># Node ID 0daa5b39d03e873ab70c3600ef0a0f439ff9509b ># Parent 2d585f99cb0664bc6793fe3412a3e22db968ec98 >Implementation of window.mozPerformance.timing > >diff --git a/docshell/base/Makefile.in b/docshell/base/Makefile.in >--- a/docshell/base/Makefile.in >+++ b/docshell/base/Makefile.in >@@ -92,19 +92,21 @@ CPPSRCS = \ > nsDocShellEditorData.cpp \ > nsDocShellTransferableHooks.cpp \ > nsDocShellEnumerator.cpp \ > nsDSURIContentListener.cpp \ > nsDefaultURIFixup.cpp \ > nsWebNavigationInfo.cpp \ > nsAboutRedirector.cpp \ > nsDownloadHistory.cpp \ >+ nsDocShellTiming.cpp \ > $(NULL) > > # we don't want the shared lib, but we want to force the creation of a > # static lib. > FORCE_STATIC_LIB = 1 > > include $(topsrcdir)/config/rules.mk > > LOCAL_INCLUDES += -I$(srcdir)/../shistory/src \ > -I$(srcdir)/../../layout/base \ >+ -I$(srcdir)/../../dom/base \ > $(NULL) >diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp >--- a/docshell/base/nsDocShell.cpp >+++ b/docshell/base/nsDocShell.cpp >@@ -221,16 +221,18 @@ static NS_DEFINE_CID(kAppShellCID, NS_AP > //#define DEBUG_DOCSHELL_FOCUS > #define DEBUG_PAGE_CACHE > #endif > > #include "nsContentErrors.h" > #include "nsIChannelPolicy.h" > #include "nsIContentSecurityPolicy.h" > >+#include "nsDocShellTiming.h" >+ > using namespace mozilla; > > // Number of documents currently loading > static PRInt32 gNumberOfDocumentsLoading = 0; > > // Global count of existing docshells. > static PRInt32 gDocShellCount = 0; > >@@ -658,16 +660,57 @@ DispatchPings(nsIContent *content, nsIUR > return; > > info.numPings = 0; > info.referrer = referrer; > > ForEachPing(content, SendPing, &info); > } > >+static nsDOMNavigationTimingType >+ConvertLoadTypeToNavigationType(PRUint32 aLoadType) >+{ >+ nsDOMNavigationTimingType result = nsIDOMNavigationTiming::NAVIGATION_OTHER; >+ switch (aLoadType) { >+ case LOAD_NORMAL: >+ case LOAD_NORMAL_EXTERNAL: >+ case LOAD_NORMAL_BYPASS_CACHE: >+ case LOAD_NORMAL_BYPASS_PROXY: >+ case LOAD_NORMAL_BYPASS_PROXY_AND_CACHE: >+ result = nsIDOMNavigationTiming::NAVIGATION_BROWSER; >+ break; >+ case LOAD_HISTORY: >+ result = nsIDOMNavigationTiming::NAVIGATION_FORWARD_BACK; >+ break; >+ case LOAD_RELOAD_NORMAL: >+ case LOAD_RELOAD_CHARSET_CHANGE: >+ case LOAD_RELOAD_BYPASS_CACHE: >+ case LOAD_RELOAD_BYPASS_PROXY: >+ case LOAD_RELOAD_BYPASS_PROXY_AND_CACHE: >+ result = nsIDOMNavigationTiming::NAVIGATION_RELOAD; >+ break; >+ case LOAD_LINK: >+ result = nsIDOMNavigationTiming::NAVIGATION_LINK; >+ break; >+ case LOAD_NORMAL_REPLACE: >+ case LOAD_STOP_CONTENT: >+ case LOAD_STOP_CONTENT_AND_REPLACE: >+ case LOAD_REFRESH: >+ case LOAD_BYPASS_HISTORY: >+ case LOAD_ERROR_PAGE: >+ case LOAD_PUSHSTATE: >+ result = nsIDOMNavigationTiming::NAVIGATION_OTHER; >+ break; >+ default: >+ NS_NOTREACHED("Unexpected load type value"); >+ } >+ >+ return result; >+} >+ > static nsISHEntry* GetRootSHEntry(nsISHEntry *entry); > > //***************************************************************************** > //*** nsDocShell: Object Management > //***************************************************************************** > > // Note: operator new zeros our memory > nsDocShell::nsDocShell(): >@@ -1493,16 +1536,18 @@ nsDocShell::FirePageHideNotification(PRB > for (i = 0; i < n; ++i) { > if (kids[i]) { > kids[i]->FirePageHideNotification(aIsUnload); > } > } > // Now make sure our editor, if any, is detached before we go > // any farther. > DetachEditorFromWindow(); >+ >+ mTiming->NotifyLastUnload(); > } > > return NS_OK; > } > > // > // Bug 13871: Prevent frameset spoofing > // >@@ -5569,16 +5614,38 @@ nsDocShell::OnProgressChange(nsIWebProgr > > NS_IMETHODIMP > nsDocShell::OnStateChange(nsIWebProgress * aProgress, nsIRequest * aRequest, > PRUint32 aStateFlags, nsresult aStatus) > { > nsresult rv; > > if ((~aStateFlags & (STATE_START | STATE_IS_NETWORK)) == 0) { >+ // Save timing statistics. >+ if (mTiming) { >+ mTiming->NotifyNavigationStart( >+ ConvertLoadTypeToNavigationType(mLoadType)); >+ } >+ else >+ { >+ mTiming = new nsDocShellTiming(); >+ NS_ENSURE_TRUE(mTiming, NS_ERROR_OUT_OF_MEMORY); >+ >+ // Is this a new window or a frame? >+ nsDOMNavigationTimingType navType = >+ nsIDOMNavigationTiming::NAVIGATION_NEW_WINDOW; >+ nsCOMPtr<nsIDocShellTreeItem> root; >+ GetSameTypeParent(getter_AddRefs(root)); >+ if (root && root != this) { >+ navType = nsIDOMNavigationTiming::NAVIGATION_FRAME; >+ } >+ >+ mTiming->NotifyNavigationStart(navType); >+ } >+ > nsCOMPtr<nsIWyciwygChannel> wcwgChannel(do_QueryInterface(aRequest)); > nsCOMPtr<nsIWebProgress> webProgress = > do_QueryInterface(GetAsSupports(this)); > > // Was the wyciwyg document loaded on this docshell? > if (wcwgChannel && !mLSHE && (mItemType == typeContent) && aProgress == webProgress.get()) { > nsCOMPtr<nsIURI> uri; > wcwgChannel->GetURI(getter_AddRefs(uri)); >@@ -5666,16 +5733,17 @@ nsDocShell::OnRedirectStateChange(nsICha > nsIChannel* aNewChannel, > PRUint32 aRedirectFlags, > PRUint32 aStateFlags) > { > NS_ASSERTION(aStateFlags & STATE_REDIRECTING, > "Calling OnRedirectStateChange when there is no redirect"); > if (!(aStateFlags & STATE_IS_DOCUMENT)) > return; // not a toplevel document >+ mTiming->NotifyRedirectStart(); > > nsCOMPtr<nsIGlobalHistory3> history3(do_QueryInterface(mGlobalHistory)); > nsresult result = NS_ERROR_NOT_IMPLEMENTED; > if (history3) { > // notify global history of this redirect > result = history3->AddDocumentRedirect(aOldChannel, aNewChannel, > aRedirectFlags, !IsFrame()); > } >@@ -5731,17 +5799,19 @@ nsDocShell::EndPageLoad(nsIWebProgress * > nsIChannel * aChannel, nsresult aStatus) > { > if(!aChannel) > return NS_ERROR_NULL_POINTER; > > nsCOMPtr<nsIURI> url; > nsresult rv = aChannel->GetURI(getter_AddRefs(url)); > if (NS_FAILED(rv)) return rv; >- >+ >+ mTiming->NotifyNavigationEnd(); >+ > // clean up reload state for meta charset > if (eCharsetReloadRequested == mCharsetReloadState) > mCharsetReloadState = eCharsetReloadStopOrigional; > else > mCharsetReloadState = eCharsetReloadInit; > > // Save a pointer to the currently-loading history entry. > // nsDocShell::EndPageLoad will clear mLSHE, but we may need this history >@@ -11162,16 +11232,23 @@ nsDocShell::GetPrintPreview(nsIWebBrowse > nsCOMPtr<nsIWebBrowserPrint> result = do_QueryInterface(print); > result.forget(aPrintPreview); > return NS_OK; > #else > return NS_ERROR_NOT_IMPLEMENTED; > #endif > } > >+NS_IMETHODIMP >+nsDocShell::GetNavigationTiming(nsIDOMNavigationTiming** aNavigationTiming) >+{ >+ NS_IF_ADDREF(*aNavigationTiming = mTiming); >+ return NS_OK; >+} >+ > > #ifdef DEBUG > unsigned long nsDocShell::gNumberOfDocShells = 0; > #endif > > NS_IMETHODIMP > nsDocShell::GetCanExecuteScripts(PRBool *aResult) > { >diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h >--- a/docshell/base/nsDocShell.h >+++ b/docshell/base/nsDocShell.h >@@ -115,16 +115,17 @@ > #include "nsIClipboardCommands.h" > #include "nsICommandManager.h" > #include "nsCRT.h" > > class nsDocShell; > class nsIController; > class OnLinkClickEvent; > class nsIScrollableFrame; >+class nsDocShellTiming; > > /* load commands were moved to nsIDocShell.h */ > /* load types were moved to nsDocShellLoadTypes.h */ > > /* internally used ViewMode types */ > enum ViewMode { > viewNormal = 0x0, > viewSource = 0x1 >@@ -744,16 +745,18 @@ protected: > // should be passed a SHEntry to save itself into. > PRPackedBool mSavingOldViewer; > #ifdef DEBUG > PRPackedBool mInEnsureScriptEnv; > #endif > > static nsIURIFixup *sURIFixup; > >+ nsCOMPtr<nsDocShellTiming> mTiming; >+ > #ifdef DEBUG > private: > // We're counting the number of |nsDocShells| to help find leaks > static unsigned long gNumberOfDocShells; > #endif /* DEBUG */ > > public: > class InterfaceRequestorProxy : public nsIInterfaceRequestor { >diff --git a/docshell/base/nsDocShellTiming.cpp b/docshell/base/nsDocShellTiming.cpp >new file mode 100644 >--- /dev/null >+++ b/docshell/base/nsDocShellTiming.cpp >@@ -0,0 +1,176 @@ >+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ >+/* ***** BEGIN LICENSE BLOCK ***** >+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 >+ * >+ * The contents of this file are subject to the Mozilla Public License Version >+ * 1.1 (the "License"); you may not use this file except in compliance with >+ * the License. You may obtain a copy of the License at >+ * http://www.mozilla.org/MPL/ >+ * >+ * Software distributed under the License is distributed on an "AS IS" basis, >+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License >+ * for the specific language governing rights and limitations under the >+ * License. >+ * >+ * The Original Code is implementation of Web Timing draft specification >+ * http://dev.w3.org/2006/webapi/WebTiming/ >+ * >+ * The Initial Developer of the Original Code is Google Inc. >+ * Portions created by the Initial Developer are Copyright (C) 2010 >+ * the Initial Developer. All Rights Reserved. >+ * >+ * Contributor(s): >+ * Sergey Novikov <sergeyn@google.com> (original author) >+ * >+ * 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 >+ * decision by deleting the provisions above and replace them with the notice >+ * and other provisions required by the GPL or the LGPL. If you do not delete >+ * the provisions above, a recipient may use your version of this file under >+ * the terms of any one of the MPL, the GPL or the LGPL. >+ * >+ * ***** END LICENSE BLOCK ***** */ >+ >+#include "nsDocShellTiming.h" >+#include "nsCOMPtr.h" >+#include "nscore.h" >+#include "prinrval.h" >+ >+#define _IMPL_NS_LAYOUT 1 >+#include "nsDOMClassInfo.h" >+ >+// Helper class. >+class nsDocShellTimingClock >+{ >+public: >+ nsDocShellTimingClock() { Reset(); } >+ >+ void Reset() >+ { >+ mStartMilliSec = PR_Now()/PR_USEC_PER_MSEC; >+ mIntervalEpoch = PR_IntervalNow(); >+ } >+ >+ PRUint64 GetTimeMilliSec() >+ { >+ return mStartMilliSec + >+ PR_IntervalToMilliseconds(PR_IntervalNow() - mIntervalEpoch); >+ } >+private: >+ PRUint64 mStartMilliSec; >+ PRIntervalTime mIntervalEpoch; >+}; >+ >+ >+nsDocShellTiming::nsDocShellTiming() : mClock(new nsDocShellTimingClock) >+{ >+ Clear(); >+} >+ >+nsDocShellTiming::~nsDocShellTiming() >+{ >+ delete mClock; >+} >+ >+void >+nsDocShellTiming::Clear() >+{ >+ mClock->Reset(); >+ mNavigationType = nsIDOMNavigationTiming::NAVIGATION_OTHER; >+ mNavigationStart = 0; >+ mRedirectStart = 0; >+ mRedirectCount = 0; >+ mLastUnload = 0; >+ mNavigationEnd = 0; >+} >+ >+void >+nsDocShellTiming::NotifyNavigationStart( >+ nsDOMNavigationTimingType aNavigationType) >+{ >+ Clear(); >+ mNavigationType = aNavigationType; >+ mNavigationStart = mClock->GetTimeMilliSec(); >+} >+ >+void >+nsDocShellTiming::NotifyRedirectStart() >+{ >+ if (mRedirectCount == 0) >+ mRedirectStart = mNavigationStart; >+ >+ mNavigationStart = mClock->GetTimeMilliSec(); >+ ++mRedirectCount; >+} >+ >+void >+nsDocShellTiming::NotifyLastUnload() >+{ >+ mLastUnload = mClock->GetTimeMilliSec(); >+} >+ >+void >+nsDocShellTiming::NotifyNavigationEnd() >+{ >+ mNavigationEnd = mClock->GetTimeMilliSec(); >+} >+ >+DOMCI_DATA(NavigationTiming, nsDocShellTiming) >+ >+NS_IMPL_ADDREF(nsDocShellTiming) >+NS_IMPL_RELEASE(nsDocShellTiming) >+ >+// QueryInterface implementation for nsDocShellTiming >+NS_INTERFACE_MAP_BEGIN(nsDocShellTiming) >+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMNavigationTiming) >+ NS_INTERFACE_MAP_ENTRY(nsIDOMNavigationTiming) >+ NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(NavigationTiming) >+NS_INTERFACE_MAP_END >+ >+NS_IMETHODIMP >+nsDocShellTiming::GetUserNavigationType( >+ nsDOMNavigationTimingType* aNavigationType) >+{ >+ *aNavigationType = mNavigationType; >+ return NS_OK; >+} >+ >+NS_IMETHODIMP >+nsDocShellTiming::GetNavigationStart(DOMTimeMilliSec* aNavigationStart) >+{ >+ *aNavigationStart = mNavigationStart; >+ return NS_OK; >+} >+ >+NS_IMETHODIMP >+nsDocShellTiming::GetRedirectStart(DOMTimeMilliSec* aRedirectStart) >+{ >+ *aRedirectStart = mRedirectStart; >+ return NS_OK; >+} >+ >+NS_IMETHODIMP >+nsDocShellTiming::GetRedirectCount(PRUint16* aRedirectCount) >+{ >+ *aRedirectCount = mRedirectCount; >+ return NS_OK; >+} >+ >+NS_IMETHODIMP >+nsDocShellTiming::GetLastUnload(DOMTimeMilliSec* aLastUnload) >+{ >+ *aLastUnload = mLastUnload; >+ return NS_OK; >+} >+ >+NS_IMETHODIMP >+nsDocShellTiming::GetNavigationEnd(DOMTimeMilliSec* aNavigationEnd) >+{ >+ *aNavigationEnd = mNavigationEnd; >+ return NS_OK; >+} >diff --git a/docshell/base/nsDocShellTiming.h b/docshell/base/nsDocShellTiming.h >new file mode 100644 >--- /dev/null >+++ b/docshell/base/nsDocShellTiming.h >@@ -0,0 +1,75 @@ >+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ >+/* ***** BEGIN LICENSE BLOCK ***** >+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 >+ * >+ * The contents of this file are subject to the Mozilla Public License Version >+ * 1.1 (the "License"); you may not use this file except in compliance with >+ * the License. You may obtain a copy of the License at >+ * http://www.mozilla.org/MPL/ >+ * >+ * Software distributed under the License is distributed on an "AS IS" basis, >+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License >+ * for the specific language governing rights and limitations under the >+ * License. >+ * >+ * The Original Code is implementation of Web Timing draft specification >+ * http://dev.w3.org/2006/webapi/WebTiming/ >+ * >+ * The Initial Developer of the Original Code is Google Inc. >+ * Portions created by the Initial Developer are Copyright (C) 2010 >+ * the Initial Developer. All Rights Reserved. >+ * >+ * Contributor(s): >+ * Sergey Novikov <sergeyn@google.com> (original author) >+ * >+ * 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 >+ * decision by deleting the provisions above and replace them with the notice >+ * and other provisions required by the GPL or the LGPL. If you do not delete >+ * the provisions above, a recipient may use your version of this file under >+ * the terms of any one of the MPL, the GPL or the LGPL. >+ * >+ * ***** END LICENSE BLOCK ***** */ >+ >+#ifndef nsDocShellTiming_h___ >+#define nsDocShellTiming_h___ >+ >+#include "nsIDOMNavigationTiming.h" >+#include "nscore.h" >+ >+class nsDocShellTimingClock; >+ >+class nsDocShellTiming : public nsIDOMNavigationTiming >+{ >+public: >+ nsDocShellTiming(); >+ >+ NS_DECL_ISUPPORTS >+ NS_DECL_NSIDOMNAVIGATIONTIMING >+ >+ void NotifyNavigationStart(nsDOMNavigationTimingType aNavigationType); >+ void NotifyRedirectStart(); >+ void NotifyLastUnload(); >+ void NotifyNavigationEnd(); >+ >+private: >+ ~nsDocShellTiming(); >+ void Clear(); >+ >+ nsDocShellTimingClock* mClock; >+ >+ nsDOMNavigationTimingType mNavigationType; >+ DOMTimeMilliSec mNavigationStart; >+ DOMTimeMilliSec mRedirectStart; >+ PRUint16 mRedirectCount; >+ DOMTimeMilliSec mLastUnload; >+ DOMTimeMilliSec mNavigationEnd; >+}; >+ >+#endif /* nsDocShellTiming_h___ */ >+ >diff --git a/docshell/base/nsIDocShell.idl b/docshell/base/nsIDocShell.idl >--- a/docshell/base/nsIDocShell.idl >+++ b/docshell/base/nsIDocShell.idl >@@ -65,16 +65,17 @@ interface nsIInputStream; > interface nsIRequest; > interface nsISHEntry; > interface nsILayoutHistoryState; > interface nsISecureBrowserUI; > interface nsIDOMStorage; > interface nsIPrincipal; > interface nsIWebBrowserPrint; > interface nsIVariant; >+interface nsIDOMNavigationTiming; > > [scriptable, uuid(8ac6b880-776a-44d4-b271-a7e64ae3debd)] > interface nsIDocShell : nsISupports > { > /** > * Loads a given URI. This will give priority to loading the requested URI > * in the object implementing this interface. If it can't be loaded here > * however, the URL dispatcher will go through its normal process of content >@@ -516,9 +517,14 @@ interface nsIDocShell : nsISupports > * Whether this docshell can execute scripts based on its hierarchy. > * The rule of thumb here is that we disable js if this docshell or any > * of its parents disallow scripting, unless the only reason for js being > * disabled in this docshell is a parent docshell having a document that > * is in design mode. In that case, we explicitly allow scripting on the > * current docshell. > */ > readonly attribute boolean canExecuteScripts; >+ >+ /** >+ * Time statistics been collected during last navigations. >+ */ >+ readonly attribute nsIDOMNavigationTiming navigationTiming; > }; >diff --git a/dom/base/Makefile.in b/dom/base/Makefile.in >--- a/dom/base/Makefile.in >+++ b/dom/base/Makefile.in >@@ -96,16 +96,17 @@ CPPSRCS = \ > nsHistory.cpp \ > nsMimeTypeArray.cpp \ > nsPluginArray.cpp \ > nsWindowRoot.cpp \ > nsDOMClassInfo.cpp \ > nsScriptNameSpaceManager.cpp \ > nsDOMScriptObjectFactory.cpp \ > nsQueryContentEventResult.cpp \ >+ nsPerformance.cpp \ > $(NULL) > > include $(topsrcdir)/dom/dom-config.mk > > ifdef MOZ_JSDEBUGGER > DEFINES += -DMOZ_JSDEBUGGER > endif > >diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp >--- a/dom/base/nsDOMClassInfo.cpp >+++ b/dom/base/nsDOMClassInfo.cpp >@@ -109,16 +109,18 @@ > #include "nsIDOMWindowInternal.h" > #include "nsPIDOMWindow.h" > #include "nsIDOMJSWindow.h" > #include "nsIDOMWindowCollection.h" > #include "nsIDOMHistory.h" > #include "nsIDOMMediaList.h" > #include "nsIDOMChromeWindow.h" > #include "nsIDOMConstructor.h" >+#include "nsIDOMNavigationTiming.h" >+#include "nsIDOMPerformance.h" > #include "nsClientRect.h" > > // DOM core includes > #include "nsDOMError.h" > #include "nsIDOMDOMException.h" > #include "nsIDOMNode.h" > #include "nsIDOM3Node.h" > #include "nsIDOM3Attr.h" >@@ -651,16 +653,20 @@ static nsDOMClassInfoData sClassInfoData > NS_DEFINE_CLASSINFO_DATA(MimeType, nsDOMGenericSH, > DOM_DEFAULT_SCRIPTABLE_FLAGS) > NS_DEFINE_CLASSINFO_DATA(MimeTypeArray, nsMimeTypeArraySH, > ARRAY_SCRIPTABLE_FLAGS) > NS_DEFINE_CLASSINFO_DATA(BarProp, nsDOMGenericSH, > DOM_DEFAULT_SCRIPTABLE_FLAGS) > NS_DEFINE_CLASSINFO_DATA(History, nsHistorySH, > ARRAY_SCRIPTABLE_FLAGS) >+ NS_DEFINE_CLASSINFO_DATA(NavigationTiming, nsDOMGenericSH, >+ DOM_DEFAULT_SCRIPTABLE_FLAGS) >+ NS_DEFINE_CLASSINFO_DATA(Performance, nsDOMGenericSH, >+ DOM_DEFAULT_SCRIPTABLE_FLAGS) > NS_DEFINE_CLASSINFO_DATA(Screen, nsDOMGenericSH, > DOM_DEFAULT_SCRIPTABLE_FLAGS) > NS_DEFINE_CLASSINFO_DATA(DOMPrototype, nsDOMConstructorSH, > DOM_BASE_SCRIPTABLE_FLAGS | > nsIXPCScriptable::WANT_HASINSTANCE | > nsIXPCScriptable::DONT_ENUM_QUERY_INTERFACE) > NS_DEFINE_CLASSINFO_DATA(DOMConstructor, nsDOMConstructorSH, > DOM_BASE_SCRIPTABLE_FLAGS | >@@ -2179,16 +2185,24 @@ nsDOMClassInfo::Init() > DOM_CLASSINFO_MAP_BEGIN(BarProp, nsIDOMBarProp) > DOM_CLASSINFO_MAP_ENTRY(nsIDOMBarProp) > DOM_CLASSINFO_MAP_END > > DOM_CLASSINFO_MAP_BEGIN(History, nsIDOMHistory) > DOM_CLASSINFO_MAP_ENTRY(nsIDOMHistory) > DOM_CLASSINFO_MAP_END > >+ DOM_CLASSINFO_MAP_BEGIN(NavigationTiming, nsIDOMNavigationTiming) >+ DOM_CLASSINFO_MAP_ENTRY(nsIDOMNavigationTiming) >+ DOM_CLASSINFO_MAP_END >+ >+ DOM_CLASSINFO_MAP_BEGIN(Performance, nsIDOMPerformance) >+ DOM_CLASSINFO_MAP_ENTRY(nsIDOMPerformance) >+ DOM_CLASSINFO_MAP_END >+ > DOM_CLASSINFO_MAP_BEGIN(Screen, nsIDOMScreen) > DOM_CLASSINFO_MAP_ENTRY(nsIDOMScreen) > DOM_CLASSINFO_MAP_END > > DOM_CLASSINFO_MAP_BEGIN_NO_CLASS_IF(DOMPrototype, nsIDOMDOMConstructor) > DOM_CLASSINFO_MAP_ENTRY(nsIDOMDOMConstructor) > DOM_CLASSINFO_MAP_END > >diff --git a/dom/base/nsDOMClassInfoClasses.h b/dom/base/nsDOMClassInfoClasses.h >--- a/dom/base/nsDOMClassInfoClasses.h >+++ b/dom/base/nsDOMClassInfoClasses.h >@@ -40,16 +40,18 @@ DOMCI_CLASS(Window) > DOMCI_CLASS(Location) > DOMCI_CLASS(Navigator) > DOMCI_CLASS(Plugin) > DOMCI_CLASS(PluginArray) > DOMCI_CLASS(MimeType) > DOMCI_CLASS(MimeTypeArray) > DOMCI_CLASS(BarProp) > DOMCI_CLASS(History) >+DOMCI_CLASS(NavigationTiming) >+DOMCI_CLASS(Performance) > DOMCI_CLASS(Screen) > DOMCI_CLASS(DOMPrototype) > DOMCI_CLASS(DOMConstructor) > > // Core classes > DOMCI_CLASS(XMLDocument) > DOMCI_CLASS(DocumentType) > DOMCI_CLASS(DOMImplementation) >@@ -485,8 +487,9 @@ DOMCI_CLASS(IDBDatabase) > DOMCI_CLASS(IDBErrorEvent) > DOMCI_CLASS(IDBSuccessEvent) > DOMCI_CLASS(IDBTransactionEvent) > DOMCI_CLASS(IDBObjectStore) > DOMCI_CLASS(IDBTransaction) > DOMCI_CLASS(IDBCursor) > DOMCI_CLASS(IDBKeyRange) > DOMCI_CLASS(IDBIndex) >+ >diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp >--- a/dom/base/nsGlobalWindow.cpp >+++ b/dom/base/nsGlobalWindow.cpp >@@ -48,16 +48,17 @@ > #ifdef MOZ_IPC > #include "base/basictypes.h" > #endif > > // Local Includes > #include "nsGlobalWindow.h" > #include "nsScreen.h" > #include "nsHistory.h" >+#include "nsPerformance.h" > #include "nsBarProps.h" > #include "nsDOMStorage.h" > #include "nsDOMOfflineResourceList.h" > #include "nsDOMError.h" > > // Helper Classes > #include "nsXPIDLString.h" > #include "nsJSUtils.h" >@@ -933,16 +934,17 @@ nsGlobalWindow::CleanUp(PRBool aIgnoreMo > mLocationbar = nsnull; > mPersonalbar = nsnull; > mStatusbar = nsnull; > mScrollbars = nsnull; > mLocation = nsnull; > mFrames = nsnull; > mApplicationCache = nsnull; > mIndexedDB = nsnull; >+ mPerformance = nsnull; > > ClearControllers(); > > mOpener = nsnull; // Forces Release > if (mContext) { > #ifdef DEBUG > nsCycleCollector_DEBUG_shouldBeFreed(mContext); > #endif >@@ -2750,16 +2752,35 @@ nsGlobalWindow::GetHistory(nsIDOMHistory > } > } > > NS_IF_ADDREF(*aHistory = mHistory); > return NS_OK; > } > > NS_IMETHODIMP >+nsGlobalWindow::GetMozPerformance(nsIDOMPerformance** aPerformance) >+{ >+ FORWARD_TO_INNER(GetMozPerformance, (aPerformance), NS_ERROR_NOT_INITIALIZED); >+ >+ *aPerformance = nsnull; >+ >+ nsIDocShell* docShell = GetDocShell(); >+ if (!mPerformance && docShell) { >+ mPerformance = new nsPerformance(docShell); >+ if (!mPerformance) { >+ return NS_ERROR_OUT_OF_MEMORY; >+ } >+ } >+ >+ NS_IF_ADDREF(*aPerformance = mPerformance); >+ return NS_OK; >+} >+ >+NS_IMETHODIMP > nsGlobalWindow::GetParent(nsIDOMWindow** aParent) > { > FORWARD_TO_OUTER(GetParent, (aParent), NS_ERROR_NOT_INITIALIZED); > > *aParent = nsnull; > if (!mDocShell) > return NS_OK; > >diff --git a/dom/base/nsGlobalWindow.h b/dom/base/nsGlobalWindow.h >--- a/dom/base/nsGlobalWindow.h >+++ b/dom/base/nsGlobalWindow.h >@@ -114,16 +114,17 @@ class nsIDOMEvent; > class nsIScrollableFrame; > class nsIControllers; > > class nsBarProp; > class nsLocation; > class nsNavigator; > class nsScreen; > class nsHistory; >+class nsPerformance; > class nsIDocShellLoadInfo; > class WindowStateHolder; > class nsGlobalWindowObserver; > class nsGlobalWindow; > class nsDummyJavaPluginOwner; > class PostMessageEvent; > class nsRunnable; > >@@ -760,16 +761,17 @@ protected: > nsWeakPtr mOpener; > nsCOMPtr<nsIControllers> mControllers; > nsCOMPtr<nsIArray> mArguments; > nsCOMPtr<nsIArray> mArgumentsLast; > nsCOMPtr<nsIPrincipal> mArgumentsOrigin; > nsRefPtr<nsNavigator> mNavigator; > nsRefPtr<nsScreen> mScreen; > nsRefPtr<nsHistory> mHistory; >+ nsRefPtr<nsPerformance> mPerformance; > nsRefPtr<nsDOMWindowList> mFrames; > nsRefPtr<nsBarProp> mMenubar; > nsRefPtr<nsBarProp> mToolbar; > nsRefPtr<nsBarProp> mLocationbar; > nsRefPtr<nsBarProp> mPersonalbar; > nsRefPtr<nsBarProp> mStatusbar; > nsRefPtr<nsBarProp> mScrollbars; > nsCOMPtr<nsIWeakReference> mWindowUtils; >diff --git a/dom/base/nsPerformance.cpp b/dom/base/nsPerformance.cpp >new file mode 100644 >--- /dev/null >+++ b/dom/base/nsPerformance.cpp >@@ -0,0 +1,85 @@ >+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ >+/* ***** BEGIN LICENSE BLOCK ***** >+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 >+ * >+ * The contents of this file are subject to the Mozilla Public License Version >+ * 1.1 (the "License"); you may not use this file except in compliance with >+ * the License. You may obtain a copy of the License at >+ * http://www.mozilla.org/MPL/ >+ * >+ * Software distributed under the License is distributed on an "AS IS" basis, >+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License >+ * for the specific language governing rights and limitations under the >+ * License. >+ * >+ * The Original Code is implementation of Web Timing draft specification >+ * http://dev.w3.org/2006/webapi/WebTiming/ >+ * >+ * The Initial Developer of the Original Code is Google Inc. >+ * Portions created by the Initial Developer are Copyright (C) 2010 >+ * the Initial Developer. All Rights Reserved. >+ * >+ * Contributor(s): >+ * Sergey Novikov <sergeyn@google.com> (original author) >+ * >+ * 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 >+ * decision by deleting the provisions above and replace them with the notice >+ * and other provisions required by the GPL or the LGPL. If you do not delete >+ * the provisions above, a recipient may use your version of this file under >+ * the terms of any one of the MPL, the GPL or the LGPL. >+ * >+ * ***** END LICENSE BLOCK ***** */ >+ >+#include "nsPerformance.h" >+#include "nsCOMPtr.h" >+#include "nscore.h" >+#include "nsIDocShell.h" >+#include "nsDOMClassInfo.h" >+ >+nsPerformance::nsPerformance(nsIDocShell* aDocShell) >+{ >+ SetDocShell(aDocShell); >+} >+ >+nsPerformance::~nsPerformance() >+{ >+} >+ >+DOMCI_DATA(Performance, nsPerformance) >+ >+NS_IMPL_ADDREF(nsPerformance) >+NS_IMPL_RELEASE(nsPerformance) >+ >+// QueryInterface implementation for nsPerformance >+NS_INTERFACE_MAP_BEGIN(nsPerformance) >+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMPerformance) >+ NS_INTERFACE_MAP_ENTRY(nsIDOMPerformance) >+ NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(Performance) >+NS_INTERFACE_MAP_END >+ >+void >+nsPerformance::SetDocShell(nsIDocShell* aDocShell) >+{ >+ mDocShell = do_GetWeakReference(aDocShell); >+} >+ >+// >+// nsIDOMPerformance methods >+// >+NS_IMETHODIMP >+nsPerformance::GetTiming(nsIDOMNavigationTiming** aNavigationTiming) >+{ >+ *aNavigationTiming = nsnull; >+ >+ nsCOMPtr<nsIDocShell> docShell(do_QueryReferent(mDocShell)); >+ NS_ENSURE_TRUE(docShell, NS_ERROR_NOT_AVAILABLE); >+ >+ return docShell->GetNavigationTiming(aNavigationTiming); >+} >+ >diff --git a/dom/base/nsPerformance.h b/dom/base/nsPerformance.h >new file mode 100644 >--- /dev/null >+++ b/dom/base/nsPerformance.h >@@ -0,0 +1,65 @@ >+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ >+/* ***** BEGIN LICENSE BLOCK ***** >+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 >+ * >+ * The contents of this file are subject to the Mozilla Public License Version >+ * 1.1 (the "License"); you may not use this file except in compliance with >+ * the License. You may obtain a copy of the License at >+ * http://www.mozilla.org/MPL/ >+ * >+ * Software distributed under the License is distributed on an "AS IS" basis, >+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License >+ * for the specific language governing rights and limitations under the >+ * License. >+ * >+ * The Original Code is implementation of Web Timing draft specification >+ * http://dev.w3.org/2006/webapi/WebTiming/ >+ * >+ * The Initial Developer of the Original Code is Google Inc. >+ * Portions created by the Initial Developer are Copyright (C) 2010 >+ * the Initial Developer. All Rights Reserved. >+ * >+ * Contributor(s): >+ * Sergey Novikov <sergeyn@google.com> (original author) >+ * >+ * 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 >+ * decision by deleting the provisions above and replace them with the notice >+ * and other provisions required by the GPL or the LGPL. If you do not delete >+ * the provisions above, a recipient may use your version of this file under >+ * the terms of any one of the MPL, the GPL or the LGPL. >+ * >+ * ***** END LICENSE BLOCK ***** */ >+#ifndef nsPerformance_h___ >+#define nsPerformance_h___ >+ >+#include "nsIDOMPerformance.h" >+#include "nscore.h" >+#include "nsWeakPtr.h" >+ >+class nsIDocShell; >+ >+// Script "performance" object >+class nsPerformance : public nsIDOMPerformance >+{ >+public: >+ nsPerformance(nsIDocShell* aDocShell); >+ >+ NS_DECL_ISUPPORTS >+ NS_DECL_NSIDOMPERFORMANCE >+ >+ void SetDocShell(nsIDocShell* aDocShell); >+ >+private: >+ ~nsPerformance(); >+ >+ nsWeakPtr mDocShell; >+}; >+ >+#endif /* nsPerformance_h___ */ >+ >diff --git a/dom/interfaces/base/Makefile.in b/dom/interfaces/base/Makefile.in >--- a/dom/interfaces/base/Makefile.in >+++ b/dom/interfaces/base/Makefile.in >@@ -78,11 +78,13 @@ XPIDLSRCS = \ > nsIDOMChromeWindow.idl \ > nsIDOMNSFeatureFactory.idl \ > nsIDOMClientRect.idl \ > nsIDOMClientRectList.idl \ > nsIFocusManager.idl \ > nsIQueryContentEventResult.idl \ > nsITabChild.idl \ > nsITabParent.idl \ >+ nsIDOMPerformance.idl \ >+ nsIDOMNavigationTiming.idl \ > $(NULL) > > include $(topsrcdir)/config/rules.mk >diff --git a/dom/interfaces/base/domstubs.idl b/dom/interfaces/base/domstubs.idl >--- a/dom/interfaces/base/domstubs.idl >+++ b/dom/interfaces/base/domstubs.idl >@@ -35,16 +35,17 @@ > * the provisions above, a recipient may use your version of this file under > * the terms of any one of the MPL, the GPL or the LGPL. > * > * ***** END LICENSE BLOCK ***** */ > > #include "nsISupports.idl" > > typedef unsigned long long DOMTimeStamp; >+typedef unsigned long long DOMTimeMilliSec; > > // Core > interface nsIDOMAttr; > interface nsIDOMCDATASection; > interface nsIDOMCharacterData; > interface nsIDOMComment; > interface nsIDOMDOMImplementation; > interface nsIDOMDocument; >diff --git a/dom/interfaces/base/nsIDOMNavigationTiming.idl b/dom/interfaces/base/nsIDOMNavigationTiming.idl >new file mode 100644 >--- /dev/null >+++ b/dom/interfaces/base/nsIDOMNavigationTiming.idl >@@ -0,0 +1,73 @@ >+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ >+/* ***** BEGIN LICENSE BLOCK ***** >+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 >+ * >+ * The contents of this file are subject to the Mozilla Public License Version >+ * 1.1 (the "License"); you may not use this file except in compliance with >+ * the License. You may obtain a copy of the License at >+ * http://www.mozilla.org/MPL/ >+ * >+ * Software distributed under the License is distributed on an "AS IS" basis, >+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License >+ * for the specific language governing rights and limitations under the >+ * License. >+ * >+ * The Original Code is implementation of Web Timing draft specification >+ * http://dev.w3.org/2006/webapi/WebTiming/ >+ * >+ * The Initial Developer of the Original Code is Google Inc. >+ * Portions created by the Initial Developer are Copyright (C) 2010 >+ * the Initial Developer. All Rights Reserved. >+ * >+ * Contributor(s): >+ * Sergey Novikov <sergeyn@google.com> (original author) >+ * >+ * 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 >+ * decision by deleting the provisions above and replace them with the notice >+ * and other provisions required by the GPL or the LGPL. If you do not delete >+ * the provisions above, a recipient may use your version of this file under >+ * the terms of any one of the MPL, the GPL or the LGPL. >+ * >+ * ***** END LICENSE BLOCK ***** */ >+ >+#include "domstubs.idl" >+ >+typedef unsigned short nsDOMNavigationTimingType; >+ >+[scriptable, uuid(2a630b50-61b6-41b3-996d-70be67fbbcb0)] >+interface nsIDOMNavigationTiming : nsISupports >+{ >+ const nsDOMNavigationTimingType NAVIGATION_OTHER = 0; >+ const nsDOMNavigationTimingType NAVIGATION_LINK = 1; >+ const nsDOMNavigationTimingType NAVIGATION_FORWARD_BACK = 2; >+ const nsDOMNavigationTimingType NAVIGATION_BROWSER = 3; >+ const nsDOMNavigationTimingType NAVIGATION_NEW_WINDOW = 4; >+ const nsDOMNavigationTimingType NAVIGATION_RELOAD = 5; >+ const nsDOMNavigationTimingType NAVIGATION_FRAME = 6; >+ readonly attribute nsDOMNavigationTimingType userNavigationType; >+ >+ readonly attribute DOMTimeMilliSec redirectStart; >+ readonly attribute unsigned short redirectCount; >+ readonly attribute DOMTimeMilliSec navigationStart; >+ readonly attribute DOMTimeMilliSec lastUnload; >+ readonly attribute DOMTimeMilliSec navigationEnd; >+ >+ // TODO: Implement commented attributes. >+ // readonly attribute DOMTimeMilliSec redirectEnd; >+ // readonly attribute DOMTimeMilliSec fetchStart; >+ // readonly attribute DOMTimeMilliSec domainLookupStart; >+ // readonly attribute DOMTimeMilliSec domainLookupEnd; >+ // readonly attribute DOMTimeMilliSec connectStart; >+ // readonly attribute DOMTimeMilliSec connectEnd; >+ // readonly attribute DOMTimeMilliSec requestStart; >+ // readonly attribute DOMTimeMilliSec requestEnd; >+ // readonly attribute DOMTimeMilliSec responseStart; >+ // readonly attribute DOMTimeMilliSec responseEnd; >+}; >+ >diff --git a/dom/interfaces/base/nsIDOMPerformance.idl b/dom/interfaces/base/nsIDOMPerformance.idl >new file mode 100644 >--- /dev/null >+++ b/dom/interfaces/base/nsIDOMPerformance.idl >@@ -0,0 +1,47 @@ >+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ >+/* ***** BEGIN LICENSE BLOCK ***** >+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 >+ * >+ * The contents of this file are subject to the Mozilla Public License Version >+ * 1.1 (the "License"); you may not use this file except in compliance with >+ * the License. You may obtain a copy of the License at >+ * http://www.mozilla.org/MPL/ >+ * >+ * Software distributed under the License is distributed on an "AS IS" basis, >+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License >+ * for the specific language governing rights and limitations under the >+ * License. >+ * >+ * The Original Code is implementation of Web Timing draft specification >+ * http://dev.w3.org/2006/webapi/WebTiming/ >+ * >+ * The Initial Developer of the Original Code is Google Inc. >+ * Portions created by the Initial Developer are Copyright (C) 2010 >+ * the Initial Developer. All Rights Reserved. >+ * >+ * Contributor(s): >+ * Sergey Novikov <sergeyn@google.com> (original author) >+ * >+ * 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 >+ * decision by deleting the provisions above and replace them with the notice >+ * and other provisions required by the GPL or the LGPL. If you do not delete >+ * the provisions above, a recipient may use your version of this file under >+ * the terms of any one of the MPL, the GPL or the LGPL. >+ * >+ * ***** END LICENSE BLOCK ***** */ >+ >+#include "nsISupports.idl" >+interface nsIDOMNavigationTiming; >+ >+[scriptable, uuid(446faf26-000b-4e66-a5fd-ae37c5ed6beb)] >+interface nsIDOMPerformance : nsISupports >+{ >+ readonly attribute nsIDOMNavigationTiming timing; >+}; >+ >diff --git a/dom/interfaces/base/nsIDOMWindowInternal.idl b/dom/interfaces/base/nsIDOMWindowInternal.idl >--- a/dom/interfaces/base/nsIDOMWindowInternal.idl >+++ b/dom/interfaces/base/nsIDOMWindowInternal.idl >@@ -37,19 +37,20 @@ > * > * ***** END LICENSE BLOCK ***** */ > > #include "nsIDOMWindow2.idl" > > interface nsIPrompt; > interface nsIControllers; > interface nsIDOMLocation; >+interface nsIDOMPerformance; > interface nsIVariant; > >-[scriptable, uuid(de12997f-9f66-4241-b092-d0ed365ad72e)] >+[scriptable, uuid(5930f197-259e-4f6b-aeca-c96a74518cc6)] > interface nsIDOMWindowInternal : nsIDOMWindow2 > { > readonly attribute nsIDOMWindowInternal window; > > /* [replaceable] self */ > readonly attribute nsIDOMWindowInternal self; > > readonly attribute nsIDOMNavigator navigator; >@@ -215,9 +216,14 @@ interface nsIDOMWindowInternal : nsIDOMW > [binaryname(PostMessageMoz)] void postMessage(in DOMString message, > in DOMString targetOrigin); > > /** > * Returns the number of times this document for this window has > * been painted to the screen. > */ > readonly attribute unsigned long long mozPaintCount; >+ >+ /** >+ * A namespace to hold performance related data and statistics. >+ */ >+ readonly attribute nsIDOMPerformance mozPerformance; > };
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Actions:
View
|
Diff
|
Review
Attachments on
bug 570341
:
449469
|
456252
|
456279
|
494409
|
504681
|
507393
|
523992
|
524173
|
524820
|
524938
|
525089
|
525386
|
531923
|
532204
|
534567
|
534661
|
534663
|
534776
|
536050
|
537130
|
540060
|
541142
|
541145
|
541149
|
541319
|
554254