diff --git a/mozilla/xpinstall/public/nsIXPIProgressDlg.idl b/mozilla/xpinstall/public/nsIXPIProgressDlg.idl index d30b54f251e..07db981adaf 100644 --- a/mozilla/xpinstall/public/nsIXPIProgressDlg.idl +++ b/mozilla/xpinstall/public/nsIXPIProgressDlg.idl @@ -35,7 +35,7 @@ interface nsIXPIProgressDlg : nsISupports void SetTitle( in wstring aTitle ); void SetHeading( in wstring aHeading ); void SetActionText( in wstring aText ); - void SetProgress( in long aValue, in long aMax ); + void SetProgress( in long aValue, in long aMax , in char mode); void StartInstallPhase(); boolean GetCancelStatus(); diff --git a/mozilla/xpinstall/res/content/xpistatus.xul b/mozilla/xpinstall/res/content/xpistatus.xul index 50d3db459a1..5cad94f5fdf 100644 --- a/mozilla/xpinstall/res/content/xpistatus.xul +++ b/mozilla/xpinstall/res/content/xpistatus.xul @@ -84,7 +84,7 @@ - + diff --git a/mozilla/xpinstall/src/nsInstallProgressDialog.cpp b/mozilla/xpinstall/src/nsInstallProgressDialog.cpp index d4306981bb8..640b0b506b3 100644 --- a/mozilla/xpinstall/src/nsInstallProgressDialog.cpp +++ b/mozilla/xpinstall/src/nsInstallProgressDialog.cpp @@ -122,7 +122,7 @@ nsInstallProgressDialog::FinalizeProgress(const PRUnichar *message, PRInt32 item nsresult rv = SetActionText( message ); if (NS_SUCCEEDED(rv)) - rv = SetProgress( itemNum, totNum ); + rv = SetProgress( itemNum, totNum, 'n' ); return rv; } @@ -208,7 +208,7 @@ nsInstallProgressDialog::SetHeading(const PRUnichar * aHeading) NS_IMETHODIMP nsInstallProgressDialog::SetActionText(const PRUnichar * aActionText) { - const PRInt32 maxChars = 40; + const PRInt32 maxChars = 50; nsString theMessage(aActionText); PRInt32 len = theMessage.Length(); @@ -224,17 +224,38 @@ nsInstallProgressDialog::SetActionText(const PRUnichar * aActionText) } NS_IMETHODIMP -nsInstallProgressDialog::SetProgress(PRInt32 aValue, PRInt32 aMax) +nsInstallProgressDialog::SetProgress(PRInt32 aValue, PRInt32 aMax, char mode) { char buf[16]; + static char modeFlag = 'n'; + nsresult rv; + static PRInt32 previousMax; + + //First check to see if the max value changed so we don't + //have to send a max value across the proxy every time. + if ( aMax != previousMax) + { + previousMax = aMax; + + PR_snprintf( buf, sizeof buf, "%lu", aMax ); + rv = setDlgAttribute( "dialog.progress", "max", buf ); + } - PR_snprintf( buf, sizeof buf, "%lu", aMax ); - nsresult rv = setDlgAttribute( "dialog.progress", "max", buf ); - + //I use this modeFlag business so I don't have to send + //progressmeter mode information across the proxy every time. + if ( mode != modeFlag ) + { + modeFlag = mode; + if ( modeFlag == 'n' ) + rv = setDlgAttribute( "dialog.progress", "mode", "normal"); + else + rv = setDlgAttribute( "dialog.progress", "mode", "undetermined"); + } + if ( NS_SUCCEEDED(rv)) { if (aMax != 0) - PR_snprintf( buf, sizeof buf, "%lu", ((aMax-aValue)/aMax) ); + PR_snprintf( buf, sizeof buf, "%lu", 100 * aValue/aMax ); else PR_snprintf( buf, sizeof buf, "%lu", 0 ); diff --git a/mozilla/xpinstall/src/nsSoftwareUpdate.cpp b/mozilla/xpinstall/src/nsSoftwareUpdate.cpp index 829c1625a82..1850f81c807 100644 --- a/mozilla/xpinstall/src/nsSoftwareUpdate.cpp +++ b/mozilla/xpinstall/src/nsSoftwareUpdate.cpp @@ -157,8 +157,8 @@ nsSoftwareUpdate::~nsSoftwareUpdate() //------------------------------------------------------------------------ // nsISupports implementation //------------------------------------------------------------------------ -NS_IMPL_ADDREF( nsSoftwareUpdate ); -NS_IMPL_RELEASE( nsSoftwareUpdate ); +NS_IMPL_THREADSAFE_ADDREF( nsSoftwareUpdate ); +NS_IMPL_THREADSAFE_RELEASE( nsSoftwareUpdate ); NS_IMETHODIMP diff --git a/mozilla/xpinstall/src/nsXPInstallManager.cpp b/mozilla/xpinstall/src/nsXPInstallManager.cpp index 6dbfb755c4f..c897241d3a2 100644 --- a/mozilla/xpinstall/src/nsXPInstallManager.cpp +++ b/mozilla/xpinstall/src/nsXPInstallManager.cpp @@ -66,7 +66,8 @@ static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID); #define XPINSTALL_BUNDLE_URL "chrome://xpinstall/locale/xpinstall.properties" nsXPInstallManager::nsXPInstallManager() - : mTriggers(0), mItem(0), mNextItem(0), mNumJars(0), mFinalizing(PR_FALSE), mCancelled(PR_FALSE) + : mTriggers(0), mItem(0), mNextItem(0), mNumJars(0), + mFinalizing(PR_FALSE), mCancelled(PR_FALSE), mContentLength(0) { NS_INIT_ISUPPORTS(); @@ -98,8 +99,8 @@ nsXPInstallManager::~nsXPInstallManager() } -NS_IMPL_ADDREF( nsXPInstallManager ); -NS_IMPL_RELEASE( nsXPInstallManager ); +NS_IMPL_THREADSAFE_ADDREF( nsXPInstallManager ); +NS_IMPL_THREADSAFE_RELEASE( nsXPInstallManager ); NS_IMETHODIMP nsXPInstallManager::QueryInterface(REFNSIID aIID,void** aInstancePtr) @@ -279,6 +280,7 @@ NS_IMETHODIMP nsXPInstallManager::DownloadNext() { nsresult rv; + mContentLength = 0; if (mCancelled) { Shutdown(); @@ -600,7 +602,17 @@ NS_IMETHODIMP nsXPInstallManager::OnProgress(nsIChannel *channel, nsISupports *ctxt, PRUint32 aProgress, PRUint32 aProgressMax) { if (!mCancelled) - return mProxy->SetProgress(aProgress, aProgressMax); + { + nsresult rv = NS_OK; + char mode = 'n'; // downloads use a "normal" progress bar + + if (mContentLength < 1) { + NS_ASSERTION(channel, "should have a channel"); + rv = channel->GetContentLength(&mContentLength); + if (NS_FAILED(rv)) return rv; + } + return mProxy->SetProgress(aProgress, mContentLength, mode); + } return NS_OK; } @@ -629,6 +641,10 @@ nsXPInstallManager::BeforeJavascriptEvaluation(const PRUnichar *URL) nsresult rv = NS_OK; mFinalizing = PR_FALSE; + mProxy->SetProgress( 0, 0, 'u' ); // turn on the barber pole + + PRUnichar tmp[] = { '\0' }; + mProxy->SetActionText(tmp); return rv; } @@ -675,7 +691,7 @@ nsXPInstallManager::FinalizeProgress(const PRUnichar *message, PRInt32 itemNum, } } } - return mProxy->SetProgress( itemNum, totNum ); + return mProxy->SetProgress( itemNum, totNum, 'n' ); } NS_IMETHODIMP diff --git a/mozilla/xpinstall/src/nsXPInstallManager.h b/mozilla/xpinstall/src/nsXPInstallManager.h index 7097221725c..033b879e21e 100644 --- a/mozilla/xpinstall/src/nsXPInstallManager.h +++ b/mozilla/xpinstall/src/nsXPInstallManager.h @@ -94,6 +94,7 @@ class nsXPInstallManager : public nsIXPINotifier, PRInt32 mNumJars; PRBool mFinalizing; PRBool mCancelled; + PRInt32 mContentLength; nsCOMPtr mDlg; nsCOMPtr mProxy;