Commit 6c65e821 authored by commit-queue@webkit.org's avatar commit-queue@webkit.org
Browse files

[BlackBerry] Reverting implementation for 407 error pages

https://bugs.webkit.org/show_bug.cgi?id=97455

Patch by Otto Derek Cheung <otcheung@rim.com> on 2012-09-24
Reviewed by Rob Buis.

Source/WebCore:

Revert "[BlackBerry] Reverting implementation for 407 error pages"
This reverts commit fda0a1b6.

This revert also reverts commit 0cffe019
due to dependency issues.

* PlatformBlackBerry.cmake:
* platform/blackberry/AuthenticationChallengeManager.cpp: Removed.
* platform/blackberry/AuthenticationChallengeManager.h:
* platform/blackberry/PageClientBlackBerry.h:
* platform/graphics/blackberry/MediaPlayerPrivateBlackBerry.cpp:
(WebCore::MediaPlayerPrivate::MediaPlayerPrivate):
(WebCore::MediaPlayerPrivate::~MediaPlayerPrivate):
(WebCore::MediaPlayerPrivate::onAuthenticationNeeded):
(WebCore::MediaPlayerPrivate::notifyChallengeResult):
* platform/graphics/blackberry/MediaPlayerPrivateBlackBerry.h:
(MediaPlayerPrivate):
* platform/network/blackberry/NetworkJob.cpp:
(WebCore::NetworkJob::NetworkJob):
(WebCore::NetworkJob::handleNotifyStatusReceived):
(WebCore::NetworkJob::notifyAuthReceived):
(WebCore::NetworkJob::handleNotifyClose):
(WebCore::NetworkJob::sendRequestWithCredentials):
(WebCore::NetworkJob::notifyChallengeResult):
* platform/network/blackberry/NetworkJob.h:
(NetworkJob):

Source/WebKit/blackberry:

Revert "[BlackBerry] Really fix bug 95488 that user can get the
authentication challenge dialog while the other tab has focus."
https://bugs.webkit.org/show_bug.cgi?id=97348

This reverts commit 0cffe019.

* Api/BlackBerryGlobal.cpp:
(BlackBerry::WebKit::globalInitialize):
* Api/WebPage.cpp:
(BlackBerry::WebKit::WebPagePrivate::WebPagePrivate):
(BlackBerry::WebKit::WebPagePrivate::~WebPagePrivate):
(BlackBerry::WebKit::WebPagePrivate::authenticationChallenge):
(BlackBerry::WebKit::WebPage::setVisible):
* Api/WebPage_p.h:
(WebPagePrivate):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@129419 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent b36882e6
2012-09-24 Otto Derek Cheung <otcheung@rim.com>
[BlackBerry] Reverting implementation for 407 error pages
https://bugs.webkit.org/show_bug.cgi?id=97455
Reviewed by Rob Buis.
Revert "[BlackBerry] Reverting implementation for 407 error pages"
This reverts commit fda0a1b6ac40c06c03bb6293b4a7d7353c3ca238.
This revert also reverts commit 0cffe01961fb80204138505bcec29a83818efb73
due to dependency issues.
* PlatformBlackBerry.cmake:
* platform/blackberry/AuthenticationChallengeManager.cpp: Removed.
* platform/blackberry/AuthenticationChallengeManager.h:
* platform/blackberry/PageClientBlackBerry.h:
* platform/graphics/blackberry/MediaPlayerPrivateBlackBerry.cpp:
(WebCore::MediaPlayerPrivate::MediaPlayerPrivate):
(WebCore::MediaPlayerPrivate::~MediaPlayerPrivate):
(WebCore::MediaPlayerPrivate::onAuthenticationNeeded):
(WebCore::MediaPlayerPrivate::notifyChallengeResult):
* platform/graphics/blackberry/MediaPlayerPrivateBlackBerry.h:
(MediaPlayerPrivate):
* platform/network/blackberry/NetworkJob.cpp:
(WebCore::NetworkJob::NetworkJob):
(WebCore::NetworkJob::handleNotifyStatusReceived):
(WebCore::NetworkJob::notifyAuthReceived):
(WebCore::NetworkJob::handleNotifyClose):
(WebCore::NetworkJob::sendRequestWithCredentials):
(WebCore::NetworkJob::notifyChallengeResult):
* platform/network/blackberry/NetworkJob.h:
(NetworkJob):
2012-09-24 Chris Rogers <crogers@google.com>
 
[REGRESSION] Layout Test webaudio/biquad-getFrequencyResponse.html is failing
......@@ -61,7 +61,6 @@ LIST(APPEND WebCore_SOURCES
bindings/cpp/WebDOMString.cpp
bindings/cpp/WebExceptionHandler.cpp
platform/blackberry/CookieDatabaseBackingStore/CookieDatabaseBackingStore.cpp
platform/blackberry/AuthenticationChallengeManager.cpp
platform/blackberry/CookieManager.cpp
platform/blackberry/CookieMap.cpp
platform/blackberry/CookieParser.cpp
......
/*
* Copyright (C) 2012 Research In Motion Limited. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.h"
#include "AuthenticationChallengeManager.h"
#include "Credential.h"
#include "KURL.h"
#include "PageClientBlackBerry.h"
#include "ProtectionSpace.h"
#include <BlackBerryPlatformAssert.h>
#include <BlackBerryPlatformLog.h>
#include <wtf/Assertions.h>
#include <wtf/HashMap.h>
#include <wtf/Vector.h>
#include <wtf/text/CString.h>
namespace WebCore {
typedef HashMap<PageClientBlackBerry*, bool> PageVisibilityMap;
struct ChallengeInfo {
ChallengeInfo(const KURL&, const ProtectionSpace&, const Credential&, AuthenticationChallengeClient*, PageClientBlackBerry*);
KURL url;
ProtectionSpace space;
Credential credential;
AuthenticationChallengeClient* authClient;
PageClientBlackBerry* pageClient;
bool blocked;
};
ChallengeInfo::ChallengeInfo(const KURL& aUrl,
const ProtectionSpace& aSpace,
const Credential& aCredential,
AuthenticationChallengeClient* anAuthClient,
PageClientBlackBerry* aPageClient)
: url(aUrl)
, space(aSpace)
, credential(aCredential)
, authClient(anAuthClient)
, pageClient(aPageClient)
, blocked(false)
{
}
class AuthenticationChallengeManagerPrivate {
public:
AuthenticationChallengeManagerPrivate();
bool resumeAuthenticationChallenge(PageClientBlackBerry*);
void startAuthenticationChallenge(ChallengeInfo*);
bool pageExists(PageClientBlackBerry*);
ChallengeInfo* m_activeChallenge;
PageVisibilityMap m_pageVisibilityMap;
Vector<OwnPtr<ChallengeInfo> > m_challenges;
};
AuthenticationChallengeManagerPrivate::AuthenticationChallengeManagerPrivate()
: m_activeChallenge(0)
{
}
bool AuthenticationChallengeManagerPrivate::resumeAuthenticationChallenge(PageClientBlackBerry* client)
{
ASSERT(!m_activeChallenge);
for (size_t i = 0; i < m_challenges.size(); ++i) {
if (m_challenges[i]->pageClient == client && m_challenges[i]->blocked) {
startAuthenticationChallenge(m_challenges[i].get());
return true;
}
}
return false;
}
void AuthenticationChallengeManagerPrivate::startAuthenticationChallenge(ChallengeInfo* info)
{
m_activeChallenge = info;
m_activeChallenge->blocked = false;
m_activeChallenge->pageClient->authenticationChallenge(m_activeChallenge->url,
m_activeChallenge->space,
m_activeChallenge->credential);
}
bool AuthenticationChallengeManagerPrivate::pageExists(PageClientBlackBerry* client)
{
return m_pageVisibilityMap.find(client) != m_pageVisibilityMap.end();
}
AuthenticationChallengeManager::AuthenticationChallengeManager()
: d(adoptPtr(new AuthenticationChallengeManagerPrivate))
{
}
void AuthenticationChallengeManager::pageCreated(PageClientBlackBerry* client)
{
d->m_pageVisibilityMap.add(client, true);
}
void AuthenticationChallengeManager::pageDeleted(PageClientBlackBerry* client)
{
d->m_pageVisibilityMap.remove(client);
if (d->m_activeChallenge && d->m_activeChallenge->pageClient == client)
d->m_activeChallenge = 0;
Vector<OwnPtr<ChallengeInfo> > existing;
d->m_challenges.swap(existing);
for (size_t i = 0; i < existing.size(); ++i) {
if (existing[i]->pageClient != client)
d->m_challenges.append(existing[i].release());
}
}
void AuthenticationChallengeManager::pageVisibilityChanged(PageClientBlackBerry* client, bool visible)
{
PageVisibilityMap::iterator iter = d->m_pageVisibilityMap.find(client);
ASSERT(iter != d->m_pageVisibilityMap.end());
if (iter == d->m_pageVisibilityMap.end()) {
d->m_pageVisibilityMap.add(client, visible);
return;
}
if (iter->second == visible)
return;
iter->second = visible;
if (!visible)
return;
if (d->m_activeChallenge)
return;
d->resumeAuthenticationChallenge(client);
}
void AuthenticationChallengeManager::authenticationChallenge(const KURL& url,
const ProtectionSpace& space,
const Credential& credential,
AuthenticationChallengeClient* authClient,
PageClientBlackBerry* pageClient)
{
BLACKBERRY_ASSERT(authClient);
BLACKBERRY_ASSERT(pageClient);
ChallengeInfo* info = new ChallengeInfo(url, space, credential, authClient, pageClient);
d->m_challenges.append(adoptPtr(info));
if (d->m_activeChallenge || !pageClient->isVisible()) {
info->blocked = true;
return;
}
d->startAuthenticationChallenge(info);
}
void AuthenticationChallengeManager::cancelAuthenticationChallenge(AuthenticationChallengeClient* client)
{
BLACKBERRY_ASSERT(client);
if (d->m_activeChallenge && d->m_activeChallenge->authClient == client)
d->m_activeChallenge = 0;
Vector<OwnPtr<ChallengeInfo> > existing;
d->m_challenges.swap(existing);
ChallengeInfo* next = 0;
PageClientBlackBerry* page = 0;
for (size_t i = 0; i < existing.size(); ++i) {
if (existing[i]->authClient != client) {
if (page && !next && existing[i]->pageClient == page)
next = existing[i].get();
d->m_challenges.append(existing[i].release());
} else if (d->m_activeChallenge == existing[i].get())
page = existing[i]->pageClient;
}
if (next)
d->startAuthenticationChallenge(next);
}
void AuthenticationChallengeManager::notifyChallengeResult(const KURL& url,
const ProtectionSpace& space,
AuthenticationChallengeResult result,
const Credential& credential)
{
d->m_activeChallenge = 0;
Vector<OwnPtr<ChallengeInfo> > existing;
d->m_challenges.swap(existing);
ChallengeInfo* next = 0;
PageClientBlackBerry* page = 0;
for (size_t i = 0; i < existing.size(); ++i) {
if (existing[i]->space != space) {
if (page && !next && existing[i]->pageClient == page)
next = existing[i].get();
d->m_challenges.append(existing[i].release());
} else {
page = existing[i]->pageClient;
existing[i]->authClient->notifyChallengeResult(existing[i]->url, space, result, credential);
// After calling notifyChallengeResult(), page could be destroyed or something.
if (!d->pageExists(page) || !page->isVisible())
page = 0;
}
}
if (next)
d->startAuthenticationChallenge(next);
}
// Keep following code at the end of this file!!!
static AuthenticationChallengeManager* s_manager = 0;
AuthenticationChallengeManager* AuthenticationChallengeManager::instance()
{
ASSERT(s_manager);
return s_manager;
}
void AuthenticationChallengeManager::init()
{
ASSERT(!s_manager);
s_manager = new AuthenticationChallengeManager();
}
// No more code after this line, all new code should come before s_manager declaration!!!
} // namespace WebCore
......@@ -19,13 +19,8 @@
#ifndef AuthenticationChallengeManager_h
#define AuthenticationChallengeManager_h
#include <wtf/OwnPtr.h>
class PageClientBlackBerry;
namespace WebCore {
class AuthenticationChallengeManagerPrivate;
class Credential;
class KURL;
class ProtectionSpace;
......@@ -40,36 +35,6 @@ public:
virtual void notifyChallengeResult(const KURL&, const ProtectionSpace&, AuthenticationChallengeResult, const Credential&) = 0;
};
class AuthenticationChallengeManager {
public:
static void init();
static AuthenticationChallengeManager* instance();
void pageCreated(PageClientBlackBerry*);
void pageDeleted(PageClientBlackBerry*);
void pageVisibilityChanged(PageClientBlackBerry*, bool visible);
void authenticationChallenge(const KURL&,
const ProtectionSpace&,
const Credential&,
AuthenticationChallengeClient*,
PageClientBlackBerry*);
void cancelAuthenticationChallenge(AuthenticationChallengeClient*);
void notifyChallengeResult(const KURL&,
const ProtectionSpace&,
AuthenticationChallengeResult,
const Credential&);
private:
AuthenticationChallengeManager();
~AuthenticationChallengeManager();
OwnPtr<AuthenticationChallengeManagerPrivate> d;
};
} // namespace WebCore
#endif // AuthenticationChallengeManager_h
......@@ -72,7 +72,7 @@ public:
virtual int showAlertDialog(BlackBerry::WebKit::WebPageClient::AlertType) = 0;
virtual bool isActive() const = 0;
virtual bool isVisible() const = 0;
virtual void authenticationChallenge(const WebCore::KURL&, const WebCore::ProtectionSpace&, const WebCore::Credential&) = 0;
virtual void authenticationChallenge(const WebCore::KURL&, const WebCore::ProtectionSpace&, const WebCore::Credential&, WebCore::AuthenticationChallengeClient*) = 0;
virtual SaveCredentialType notifyShouldSaveCredential(bool) = 0;
virtual void syncProxyCredential(const WebCore::Credential&) = 0;
};
......
......@@ -21,7 +21,6 @@
#if ENABLE(VIDEO)
#include "MediaPlayerPrivateBlackBerry.h"
#include "AuthenticationChallengeManager.h"
#include "CookieManager.h"
#include "Credential.h"
#include "CredentialStorage.h"
......@@ -115,7 +114,6 @@ MediaPlayerPrivate::MediaPlayerPrivate(MediaPlayer* player)
, m_userDrivenSeekTimer(this, &MediaPlayerPrivate::userDrivenSeekTimerFired)
, m_lastSeekTime(0)
, m_lastSeekTimePending(false)
, m_isAuthenticationChallenging(false)
, m_waitMetadataTimer(this, &MediaPlayerPrivate::waitMetadataTimerFired)
, m_waitMetadataPopDialogCounter(0)
{
......@@ -123,9 +121,6 @@ MediaPlayerPrivate::MediaPlayerPrivate(MediaPlayer* player)
MediaPlayerPrivate::~MediaPlayerPrivate()
{
if (m_isAuthenticationChallenging)
AuthenticationChallengeManager::instance()->cancelAuthenticationChallenge(this);
if (isFullscreen()) {
m_webCorePlayer->mediaPlayerClient()->mediaPlayerExitFullscreen();
}
......@@ -715,18 +710,12 @@ void MediaPlayerPrivate::onAuthenticationNeeded(MMRAuthChallenge& authChallenge)
return;
}
m_isAuthenticationChallenging = true;
AuthenticationChallengeManager::instance()->authenticationChallenge(url,
protectionSpace,
credential,
this,
m_webCorePlayer->mediaPlayerClient()->mediaPlayerHostWindow()->platformPageClient());
if (frameView() && frameView()->hostWindow())
frameView()->hostWindow()->platformPageClient()->authenticationChallenge(url, protectionSpace, credential, this);
}
void MediaPlayerPrivate::notifyChallengeResult(const KURL& url, const ProtectionSpace& protectionSpace, AuthenticationChallengeResult result, const Credential& credential)
{
m_isAuthenticationChallenging = false;
if (result != AuthenticationChallengeSuccess || !url.isValid())
return;
......
......@@ -174,7 +174,6 @@ private:
Timer<MediaPlayerPrivate> m_userDrivenSeekTimer;
float m_lastSeekTime;
bool m_lastSeekTimePending;
bool m_isAuthenticationChallenging;
void waitMetadataTimerFired(Timer<MediaPlayerPrivate>*);
Timer<MediaPlayerPrivate> m_waitMetadataTimer;
int m_waitMetadataPopDialogCounter;
......
......@@ -19,7 +19,6 @@
#include "config.h"
#include "NetworkJob.h"
#include "AuthenticationChallengeManager.h"
#include "Chrome.h"
#include "ChromeClient.h"
#include "CookieManager.h"
......@@ -85,16 +84,9 @@ NetworkJob::NetworkJob()
, m_deferredData(*this)
, m_deferLoadingCount(0)
, m_frame(0)
, m_isAuthenticationChallenging(false)
{
}
NetworkJob::~NetworkJob()
{
if (m_isAuthenticationChallenging)
AuthenticationChallengeManager::instance()->cancelAuthenticationChallenge(this);
}
bool NetworkJob::initialize(int playerId,
const String& pageGroupName,
const KURL& url,
......@@ -192,6 +184,12 @@ void NetworkJob::handleNotifyStatusReceived(int status, const String& message)
if (isInfo(status))
return; // ignore
// Load up error page and ask the user to change their wireless proxy settings
if (status == 407) {
const ResourceError error = ResourceError(ResourceError::httpErrorDomain, BlackBerry::Platform::FilterStream::StatusWifiProxyAuthError, m_response.url().string(), emptyString());
m_handle->client()->didFail(m_handle.get(), error);
}
m_statusReceived = true;
// Convert non-HTTP status codes to generic HTTP codes.
......@@ -205,8 +203,10 @@ void NetworkJob::handleNotifyStatusReceived(int status, const String& message)
m_response.setHTTPStatusText(message);
if (isUnauthorized(m_extendedStatusCode))
if (isUnauthorized(m_extendedStatusCode)) {
purgeCredentials();
BlackBerry::Platform::log(BlackBerry::Platform::LogLevelCritical, "Authentication failed, purge the stored credentials for this site.");
}
}
void NetworkJob::notifyHeadersReceived(BlackBerry::Platform::NetworkRequest::HeaderList& headers)
......@@ -294,11 +294,10 @@ void NetworkJob::notifyAuthReceived(BlackBerry::Platform::NetworkRequest::AuthTy
}
storeCredentials();
return;
} else {
purgeCredentials();
m_newJobWithCredentialsStarted = sendRequestWithCredentials(serverType, scheme, realm, requireCredentials);
}
purgeCredentials();
m_newJobWithCredentialsStarted = sendRequestWithCredentials(serverType, scheme, realm, requireCredentials);
}
void NetworkJob::notifyStringHeaderReceived(const String& key, const String& value)
......@@ -485,7 +484,6 @@ void NetworkJob::handleNotifyClose(int status)
#ifndef NDEBUG
m_isRunning = false;
#endif
if (!m_cancelled) {
if (!m_statusReceived) {
// Connection failed before sending notifyStatusReceived: use generic NetworkError.
......@@ -497,7 +495,6 @@ void NetworkJob::handleNotifyClose(int status)
m_extendedStatusCode = BlackBerry::Platform::FilterStream::StatusTooManyRedirects;
sendResponseIfNeeded();
if (isClientAvailable()) {
if (isError(status))
m_extendedStatusCode = status;
......@@ -728,15 +725,8 @@ bool NetworkJob::sendRequestWithCredentials(ProtectionSpaceServerType type, Prot
String host;
int port;
if (type == ProtectionSpaceProxyHTTP) {
String proxyAddress = BlackBerry::Platform::Client::get()->getProxyAddress(newURL.string().ascii().data()).c_str();
KURL proxyURL(KURL(), proxyAddress);
host = proxyURL.host();
port = proxyURL.port();
} else {
host = m_response.url().host();
port = m_response.url().port();
}
host = m_response.url().host();
port = m_response.url().port();
ProtectionSpace protectionSpace(host, port, type, realm, scheme);
......@@ -763,37 +753,22 @@ bool NetworkJob::sendRequestWithCredentials(ProtectionSpaceServerType type, Prot
String username;
String password;
if (type == ProtectionSpaceProxyHTTP) {
username = BlackBerry::Platform::Client::get()->getProxyUsername().c_str();
password = BlackBerry::Platform::Client::get()->getProxyPassword().c_str();
}
// Before asking the user for credentials, we check if the URL contains that.
if (!m_handle->getInternal()->m_user.isEmpty() && !m_handle->getInternal()->m_pass.isEmpty()) {
username = m_handle->getInternal()->m_user;
password = m_handle->getInternal()->m_pass;
if (username.isEmpty() || password.isEmpty()) {
// Before asking the user for credentials, we check if the URL contains that.
if (!m_handle->getInternal()->m_user.isEmpty() && !m_handle->getInternal()->m_pass.isEmpty()) {
username = m_handle->getInternal()->m_user;
password = m_handle->getInternal()->m_pass;
// Prevent them from been used again if they are wrong.
// If they are correct, they will the put into CredentialStorage.
m_handle->getInternal()->m_user = "";
m_handle->getInternal()->m_pass = "";
} else {
if (m_handle->firstRequest().targetType() != ResourceRequest::TargetIsMainFrame && BlackBerry::Platform::Settings::instance()->isChromeProcess())
return false;
m_handle->getInternal()->m_currentWebChallenge = AuthenticationChallenge();
m_isAuthenticationChallenging = true;
updateDeferLoadingCount(1);
AuthenticationChallengeManager::instance()->authenticationChallenge(newURL,
protectionSpace,
Credential(),
this,
m_frame->page()->chrome()->client()->platformPageClient());
return true;
}
// Prevent them from been used again if they are wrong.
// If they are correct, they will the put into CredentialStorage.
m_handle->getInternal()->m_user = "";
m_handle->getInternal()->m_pass = "";
} else {
if (m_handle->firstRequest().targetType() != ResourceRequest::TargetIsMainFrame && BlackBerry::Platform::Settings::instance()->isChromeProcess())
return false;
m_handle->getInternal()->m_currentWebChallenge = AuthenticationChallenge();
m_frame->page()->chrome()->client()->platformPageClient()->authenticationChallenge(newURL, protectionSpace, Credential(), this);
return true;
}
credential = Credential(username, password, CredentialPersistenceForSession);
......@@ -853,17 +828,11 @@ void NetworkJob::fireDeleteJobTimer(Timer<NetworkJob>*)
void NetworkJob::notifyChallengeResult(const KURL& url, const ProtectionSpace& protectionSpace, AuthenticationChallengeResult result, const Credential& credential)
{
m_isAuthenticationChallenging = false;
if (result != AuthenticationChallengeSuccess || protectionSpace.host().isEmpty() || !url.isValid()) {
m_newJobWithCredentialsStarted = false;
updateDeferLoadingCount(-1);
return;
}
cancelJob();
updateDeferLoadingCount(-1);
if (m_handle->getInternal()->m_currentWebChallenge.isNull())
m_handle->getInternal()->m_currentWebChallenge = AuthenticationChallenge(protectionSpace, credential, 0, m_response, ResourceError());
......