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;