Skip to content

Commit

Permalink
[sailfishos][embedlite] Support custom http user agent string managem…
Browse files Browse the repository at this point in the history
…ent. JB#53790 OMP#JOLLA-23

Integrates custom user agent strings into EmbedLiteView. This includes
allowing a custom user agent string to be sent by and receiving
notifications about the actual user agent string used for a request.
  • Loading branch information
llewelld committed Apr 28, 2021
1 parent e2967be commit 18b5f14
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 18b5f14

Please sign in to comment.