Skip to content

Commit

Permalink
Merge branch 'jb53790' into 'master'
Browse files Browse the repository at this point in the history
Support custom http user agent string management

See merge request mer-core/gecko-dev!249
  • Loading branch information
llewelld committed Apr 28, 2021
2 parents e2967be + 18b5f14 commit bf40be6
Show file tree
Hide file tree
Showing 10 changed files with 163 additions and 3 deletions.
10 changes: 9 additions & 1 deletion embedding/embedlite/EmbedLiteView.cpp
Expand Up @@ -147,7 +147,6 @@ void EmbedLiteView::GoBack()
{
NS_ENSURE_TRUE(mViewParent, );
Unused << mViewParent->SendGoBack();

}

void EmbedLiteView::GoForward()
Expand All @@ -169,6 +168,15 @@ void EmbedLiteView::Reload(bool hard)
Unused << mViewParent->SendReload(hard);
}

void
EmbedLiteView::SetHttpUserAgent(const char16_t* aHttpUserAgent)
{
LOGT();
NS_ENSURE_TRUE(mViewParent, );
const nsDependentString httpUserAgent(aHttpUserAgent);
Unused << mViewParent->SendSetHttpUserAgent(httpUserAgent);
}

void EmbedLiteView::ScrollTo(int x, int y)
{
LOGT();
Expand Down
2 changes: 2 additions & 0 deletions embedding/embedlite/EmbedLiteView.h
Expand Up @@ -50,6 +50,7 @@ class EmbedLiteViewListener
virtual void OnTitleChanged(const char16_t* aTitle) {}
virtual void SetBackgroundColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {}
virtual void OnWindowCloseRequested(void) {}
virtual void OnHttpUserAgentUsed(const char16_t* aHttpUserAgent) {}

virtual bool HandleScrollEvent(bool aIsRootScrollFrame, const gfxRect& aContentRect,
const gfxSize& aScrollableSize) { return false; }
Expand Down Expand Up @@ -86,6 +87,7 @@ class EmbedLiteView
virtual void GoForward();
virtual void StopLoad();
virtual void Reload(bool hard);
virtual void SetHttpUserAgent(const char16_t* aHttpUserAgent);

// Scrolling methods see nsIDomWindow.idl
// Scrolls this view to an absolute pixel offset.
Expand Down
2 changes: 2 additions & 0 deletions embedding/embedlite/PEmbedLiteView.ipdl
Expand Up @@ -54,6 +54,7 @@ child:
async SetThrottlePainting(bool aThrottle);
async SetMargins(int top, int right, int bottom, int left);
async ScheduleUpdate();
async SetHttpUserAgent(nsString aHttpUserAgent);
async SuspendTimeouts();
async ResumeTimeouts();
async HandleScrollEvent(bool isRootScrollFrame, gfxRect contentRect, gfxSize scrollSize);
Expand Down Expand Up @@ -101,6 +102,7 @@ parent:
async OnScrollChanged(int32_t offSetX, int32_t offSetY);
async OnTitleChanged(nsString aTitle);
async OnWindowCloseRequested();
async OnHttpUserAgentUsed(nsString aHttpUserAgent);

/**
* Updates the zoom constraints for a scrollable frame in this tab.
Expand Down
20 changes: 20 additions & 0 deletions embedding/embedlite/embedshared/EmbedLiteViewBaseChild.cpp
Expand Up @@ -764,6 +764,20 @@ mozilla::ipc::IPCResult EmbedLiteViewBaseChild::RecvScheduleUpdate()
return IPC_OK();
}

mozilla::ipc::IPCResult EmbedLiteViewBaseChild::RecvSetHttpUserAgent(const nsString& aHttpUserAgent)
{
nsCOMPtr<nsIObserverService> observerService =
do_GetService(NS_OBSERVERSERVICE_CONTRACTID);
if (observerService) {
LOGT("Setting user agent: %s", NS_ConvertUTF16toUTF8(aHttpUserAgent).get());
observerService->NotifyObservers(mDOMWindow,
"embedliteviewhttpuseragentchanged",
aHttpUserAgent.get());
}

return IPC_OK();
}

mozilla::ipc::IPCResult EmbedLiteViewBaseChild::RecvSuspendTimeouts()
{
NS_ENSURE_TRUE(mDOMWindow, IPC_OK());
Expand Down Expand Up @@ -1280,6 +1294,12 @@ EmbedLiteViewBaseChild::OnWindowCloseRequested()
return NS_ERROR_FAILURE;
}

NS_IMETHODIMP
EmbedLiteViewBaseChild::OnHttpUserAgentUsed(const char16_t* aHttpUserAgent)
{
return SendOnHttpUserAgentUsed(nsDependentString(aHttpUserAgent)) ? NS_OK : NS_ERROR_FAILURE;
}

NS_IMETHODIMP
EmbedLiteViewBaseChild::OnLoadRedirect()
{
Expand Down
1 change: 1 addition & 0 deletions embedding/embedlite/embedshared/EmbedLiteViewBaseChild.h
Expand Up @@ -147,6 +147,7 @@ class EmbedLiteViewBaseChild : public PEmbedLiteViewChild,
virtual mozilla::ipc::IPCResult RecvSetThrottlePainting(const bool &) override;
virtual mozilla::ipc::IPCResult RecvSetMargins(const int&, const int&, const int&, const int&) override;
virtual mozilla::ipc::IPCResult RecvScheduleUpdate();
virtual mozilla::ipc::IPCResult RecvSetHttpUserAgent(const nsString& aHhttpUserAgent) override;

virtual mozilla::ipc::IPCResult RecvSuspendTimeouts() override;
virtual mozilla::ipc::IPCResult RecvResumeTimeouts() override;
Expand Down
9 changes: 9 additions & 0 deletions embedding/embedlite/embedshared/EmbedLiteViewBaseParent.cpp
Expand Up @@ -168,6 +168,15 @@ mozilla::ipc::IPCResult EmbedLiteViewBaseParent::RecvOnWindowCloseRequested()
return IPC_OK();
}

mozilla::ipc::IPCResult EmbedLiteViewBaseParent::RecvOnHttpUserAgentUsed(const nsString& aHttpUserAgent)
{
LOGT();
NS_ENSURE_TRUE(mView && !mViewAPIDestroyed, IPC_OK());

mView->GetListener()->OnHttpUserAgentUsed(aHttpUserAgent.get());
return IPC_OK();
}

mozilla::ipc::IPCResult EmbedLiteViewBaseParent::RecvOnLoadRedirect()
{
LOGT();
Expand Down
2 changes: 2 additions & 0 deletions embedding/embedlite/embedshared/EmbedLiteViewBaseParent.h
Expand Up @@ -104,6 +104,8 @@ class EmbedLiteViewBaseParent : public PEmbedLiteViewParent,
const int32_t &aCause,
const int32_t &aFocusChange) override;

virtual mozilla::ipc::IPCResult RecvOnHttpUserAgentUsed(const nsString &aHttpUserAgent) override;

// EmbedLiteWindowParentObserver:
void CompositorCreated() override;

Expand Down
111 changes: 110 additions & 1 deletion embedding/embedlite/utils/WebBrowserChrome.cpp
Expand Up @@ -28,6 +28,9 @@
#include "nsIURIFixup.h"
#include "nsIEmbedBrowserChromeListener.h"
#include "nsIBaseWindow.h"
#include "nsIMultiPartChannel.h"
#include "nsIHttpProtocolHandler.h"
#include "nsIObserver.h"
#include "mozilla/dom/ScriptSettings.h" // for AutoNoJSAPI
#include "TabChildHelper.h"
#include "mozilla/ContentEvents.h" // for InternalScrollAreaEvent
Expand All @@ -38,6 +41,31 @@
#define MOZ_pagehide "pagehide"
#define MOZ_MozScrolledAreaChanged "MozScrolledAreaChanged"

static nsresult GetHttpChannelHelper(nsIChannel* aChannel,
nsIHttpChannel** aHttpChannel) {
nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(aChannel);
if (httpChannel) {
httpChannel.forget(aHttpChannel);
return NS_OK;
}

nsCOMPtr<nsIMultiPartChannel> multipart = do_QueryInterface(aChannel);
if (!multipart) {
*aHttpChannel = nullptr;
return NS_OK;
}

nsCOMPtr<nsIChannel> baseChannel;
nsresult rv = multipart->GetBaseChannel(getter_AddRefs(baseChannel));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}

httpChannel = do_QueryInterface(baseChannel);
httpChannel.forget(aHttpChannel);

return NS_OK;
}

WebBrowserChrome::WebBrowserChrome(nsIEmbedBrowserChromeListener* aListener)
: mChromeFlags(0)
Expand All @@ -50,6 +78,7 @@ WebBrowserChrome::WebBrowserChrome(nsIEmbedBrowserChromeListener* aListener)
, mFirstPaint(false)
, mScrollOffset(0,0)
, mListener(aListener)
, mRequest(nullptr)
{
LOGT();
}
Expand All @@ -66,7 +95,8 @@ NS_IMPL_ISUPPORTS(WebBrowserChrome,
nsIInterfaceRequestor,
nsIEmbeddingSiteWindow,
nsIWebProgressListener,
nsISupportsWeakReference)
nsISupportsWeakReference,
nsIObserver)

NS_IMETHODIMP WebBrowserChrome::GetInterface(const nsIID& aIID, void** aInstancePtr)
{
Expand Down Expand Up @@ -276,9 +306,11 @@ WebBrowserChrome::OnStateChange(nsIWebProgress* progress, nsIRequest* request,
}

if (progressStateFlags & nsIWebProgressListener::STATE_START && progressStateFlags & nsIWebProgressListener::STATE_IS_DOCUMENT) {
Unused << AddUserAgentObserver(request);
mListener->OnLoadStarted(mLastLocation.get());
}
if (progressStateFlags & nsIWebProgressListener::STATE_STOP && progressStateFlags & nsIWebProgressListener::STATE_IS_DOCUMENT) {
Unused << RemoveUserAgentObserver(request);
mListener->OnLoadFinished();
}
if (progressStateFlags & nsIWebProgressListener::STATE_REDIRECTING) {
Expand Down Expand Up @@ -718,3 +750,80 @@ void WebBrowserChrome::SetTabChildHelper(TabChildHelper* aHelper)

mHelper = aHelper;
}

nsresult WebBrowserChrome::GetHttpUserAgent(nsIRequest* request, nsAString& aHttpUserAgent)
{
nsCOMPtr<nsIChannel> channel = do_QueryInterface(request);
if (!channel) {
return NS_ERROR_NOT_INITIALIZED;
}

nsCOMPtr<nsIHttpChannel> httpChannel;
nsresult rv = GetHttpChannelHelper(channel, getter_AddRefs(httpChannel));
if (NS_FAILED(rv)) {
return rv;
}

nsAutoCString tCspUserAgent;
if (httpChannel) {
Unused << httpChannel->GetRequestHeader(
NS_LITERAL_CSTRING("User-Agent"), tCspUserAgent);
}

aHttpUserAgent = NS_ConvertASCIItoUTF16(tCspUserAgent);

return NS_OK;
}

nsresult WebBrowserChrome::AddUserAgentObserver(nsIRequest* request)
{
if (mRequest) {
return NS_OK;
}
mRequest = request;

nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
NS_ENSURE_STATE(os);

nsresult rv = os->AddObserver(this, NS_HTTP_ON_BEFORE_CONNECT_TOPIC, true);
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}

nsresult WebBrowserChrome::RemoveUserAgentObserver(nsIRequest* request)
{
if (!mRequest) {
return NS_OK;
}
mRequest = nullptr;
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
if (os) {
os->RemoveObserver(this, NS_HTTP_ON_BEFORE_CONNECT_TOPIC);
}
return NS_OK;
}

NS_IMETHODIMP
WebBrowserChrome::Observe(nsISupports* aSubject, const char* aTopic,
const char16_t* aData) {

if (strcmp(aTopic, NS_HTTP_ON_BEFORE_CONNECT_TOPIC) == 0) {
nsCOMPtr<nsIRequest> request = do_QueryInterface(aSubject);
if (!request) {
return NS_OK;
}
if (mRequest != request) {
return NS_OK;
}
nsAutoString httpUserAgent;
nsresult rv = GetHttpUserAgent(request, httpUserAgent);
if (NS_FAILED(rv)) {
return NS_OK;
}
// Notify listeners about the user agent string in use
mListener->OnHttpUserAgentUsed(httpUserAgent.get());
}

return NS_OK;
}

8 changes: 7 additions & 1 deletion embedding/embedlite/utils/WebBrowserChrome.h
Expand Up @@ -36,7 +36,8 @@ class WebBrowserChrome : public nsIWebBrowserChrome2,
public nsIEmbeddingSiteWindow,
public nsIInterfaceRequestor,
public nsIDOMEventListener,
public nsSupportsWeakReference
public nsSupportsWeakReference,
public nsIObserver
{
public:
NS_DECL_ISUPPORTS
Expand All @@ -47,6 +48,7 @@ class WebBrowserChrome : public nsIWebBrowserChrome2,
NS_DECL_NSIEMBEDDINGSITEWINDOW
NS_DECL_NSIINTERFACEREQUESTOR
NS_DECL_NSIDOMEVENTLISTENER
NS_DECL_NSIOBSERVER

WebBrowserChrome(nsIEmbedBrowserChromeListener* aListener);

Expand All @@ -63,6 +65,9 @@ class WebBrowserChrome : public nsIWebBrowserChrome2,
nsIntPoint GetScrollOffset(mozIDOMWindowProxy *aWindow);
nsresult GetDocShellPtr(nsIDocShell **aDocShell);
nsresult GetDocumentPtr(nsIDocument **aDocument);
nsresult GetHttpUserAgent(nsIRequest* request, nsAString& aHttpUserAgent);
nsresult AddUserAgentObserver(nsIRequest* request);
nsresult RemoveUserAgentObserver(nsIRequest* request);

void SendScroll();

Expand All @@ -82,6 +87,7 @@ class WebBrowserChrome : public nsIWebBrowserChrome2,
nsIEmbedBrowserChromeListener* mListener;
nsString mTitle;
RefPtr<mozilla::embedlite::TabChildHelper> mHelper;
RefPtr<nsIRequest> mRequest;
};

#endif /* Header guard */
Expand Down
Expand Up @@ -30,4 +30,5 @@ interface nsIEmbedBrowserChromeListener : nsISupports
void onScrollChanged(in int32_t offSetX, in int32_t offSetY);
void onTitleChanged(in wstring aTitle);
void onUpdateDisplayPort();
void onHttpUserAgentUsed(in wstring aHttpUserAgent);
};

0 comments on commit bf40be6

Please sign in to comment.