Skip to content

Commit

Permalink
Align EmbedLiteAppService -- SecureJSContext missing
Browse files Browse the repository at this point in the history
  • Loading branch information
rainemak committed Apr 8, 2020
1 parent 6c963fa commit 0c2163f
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 32 deletions.
73 changes: 45 additions & 28 deletions embedding/embedlite/modules/EmbedLiteAppService.cpp
Expand Up @@ -29,7 +29,7 @@
#include "nsIWebBrowser.h"
#include "apz/src/AsyncPanZoomController.h" // for AsyncPanZoomController
#include "mozilla/embedlite/EmbedLog.h"
#include "xpcprivate.h"
// #include "xpcprivate.h"
#include "nsPIDOMWindow.h"
#include "mozilla/AutoRestore.h"
#include "FrameMetrics.h"
Expand Down Expand Up @@ -120,15 +120,15 @@ void EmbedLiteAppService::UnregisterView(uint32_t aId)
}

NS_IMETHODIMP
EmbedLiteAppService::GetIDByWindow(nsIDOMWindow* aWin, uint32_t* aId)
EmbedLiteAppService::GetIDByWindow(mozIDOMWindowProxy* aWindow, uint32_t* aId)
{
dom::AutoJSAPI jsapiChromeGuard;
nsCOMPtr<nsIWebNavigation> navNav(do_GetInterface(aWin));
nsCOMPtr<nsIWebNavigation> navNav(do_GetInterface(aWindow));
nsCOMPtr<nsIDocShellTreeItem> navItem(do_QueryInterface(navNav));
NS_ENSURE_TRUE(navItem, NS_ERROR_FAILURE);
nsCOMPtr<nsIDocShellTreeItem> rootItem;
navItem->GetRootTreeItem(getter_AddRefs(rootItem));
nsCOMPtr<nsIDOMWindow> rootWin(do_GetInterface(rootItem));
nsCOMPtr<mozIDOMWindowProxy> rootWin(do_GetInterface(rootItem));
NS_ENSURE_TRUE(rootWin, NS_ERROR_FAILURE);

nsCOMPtr<nsPIDOMWindowOuter> pwindow(do_QueryInterface(rootWin));
Expand Down Expand Up @@ -227,29 +227,33 @@ EmbedLiteAppService::HandleAsyncMessage(const char* aMessage, const nsString& aD

NS_IMETHODIMP EmbedLiteAppService::EnterSecureJSContext()
{
nsIXPConnect *xpc = nsContentUtils::XPConnect();
if (!xpc) {
// If someone tries to push a cx when we don't have the relevant state,
// it's probably safest to just crash.
MOZ_CRASH();
}
// nsIXPConnect *xpc = nsContentUtils::XPConnect();
// if (!xpc) {
// // If someone tries to push a cx when we don't have the relevant state,
// // it's probably safest to just crash.
// MOZ_CRASH();
// }

if (!xpc::PushNullJSContext()) {
MOZ_CRASH();
}
// Maybe just nsContentUtils::IsSafeToRunScript(), need to analyze embedlite-components
// or nsContentUtils::AddScriptBlocker() and nsContentUtils::RemoveScriptBlocker
// or nsContentUtils::EnterMicroTask and nsContentUtils::LeaveMicroTask

// if (!xpc::PushNullJSContext()) {
// MOZ_CRASH();
// }

mPushedSomething++;
return NS_OK;
}

NS_IMETHODIMP EmbedLiteAppService::LeaveSecureJSContext()
{
MOZ_ASSERT(nsContentUtils::XPConnect());
if (!mPushedSomething) {
return NS_ERROR_FAILURE;
}
// MOZ_ASSERT(nsContentUtils::XPConnect());
// if (!mPushedSomething) {
// return NS_ERROR_FAILURE;
// }

xpc::PopNullJSContext();
// xpc::PopNullJSContext();
mPushedSomething--;
return NS_OK;
}
Expand Down Expand Up @@ -311,17 +315,21 @@ EmbedLiteAppService::GetBrowserByID(uint32_t aId, nsIWebBrowser * *outWindow)


NS_IMETHODIMP
EmbedLiteAppService::GetContentWindowByID(uint32_t aId, nsIDOMWindow * *outWindow)
EmbedLiteAppService::GetContentWindowByID(uint32_t aId, mozIDOMWindowProxy * *contentWindow)
{
EmbedLiteViewChildIface* view = sGetViewById(aId);
NS_ENSURE_TRUE(view, NS_ERROR_FAILURE);
nsresult rv;
nsCOMPtr<nsIWebBrowser> br;
rv = view->GetBrowser(getter_AddRefs(br));
NS_ENSURE_TRUE(br, rv);
nsCOMPtr<nsIDOMWindow> domWindow;
nsCOMPtr<mozIDOMWindowProxy> domWindow;
br->GetContentDOMWindow(getter_AddRefs(domWindow));
domWindow.forget(outWindow);
if (!domWindow) {
return NS_ERROR_NOT_AVAILABLE;
}

domWindow.forget(contentWindow);
return rv;
}

Expand All @@ -335,17 +343,17 @@ EmbedLiteAppService::SendAsyncMessageLocal(uint32_t aId, const char16_t* message
}

NS_IMETHODIMP
EmbedLiteAppService::ChromeEventHandler(nsIDOMWindow *aWin, nsIDOMEventTarget * *eventHandler)
EmbedLiteAppService::ChromeEventHandler(mozIDOMWindowProxy *aWindow, nsIDOMEventTarget * *eventHandler)
{
nsCOMPtr<nsPIDOMWindow> pidomWindow = do_GetInterface(aWin);
nsCOMPtr<nsPIDOMWindowOuter> pidomWindow = do_GetInterface(aWindow);
NS_ENSURE_TRUE(pidomWindow, NS_ERROR_FAILURE);
nsCOMPtr<nsIDOMEventTarget> target = do_QueryInterface(pidomWindow->GetChromeEventHandler());
*eventHandler = target.forget().take();
return NS_OK;
}

NS_IMETHODIMP
EmbedLiteAppService::GetAnyEmbedWindow(bool aActive, nsIDOMWindow * *aWin)
EmbedLiteAppService::GetAnyEmbedWindow(bool aActive, mozIDOMWindowProxy * *embedWindow)
{
std::map<uint64_t, uint32_t>::iterator it;
for (it = mIDMap.begin(); it != mIDMap.end(); ++it) {
Expand All @@ -356,9 +364,14 @@ EmbedLiteAppService::GetAnyEmbedWindow(bool aActive, nsIDOMWindow * *aWin)
nsCOMPtr<nsIWebBrowser> br;
rv = view->GetBrowser(getter_AddRefs(br));
NS_ENSURE_TRUE(br, rv);
nsCOMPtr<nsIDOMWindow> domWindow;
nsCOMPtr<mozIDOMWindowProxy> domWindow;
br->GetContentDOMWindow(getter_AddRefs(domWindow));
*aWin = domWindow.forget().take();
if (!domWindow) {
return NS_ERROR_NOT_AVAILABLE;
}

nsCOMPtr<nsPIDOMWindowOuter> piWindow = nsPIDOMWindowOuter::From(domWindow);
piWindow.forget(embedWindow);
return NS_OK;
} else {
nsresult rv;
Expand All @@ -368,9 +381,13 @@ EmbedLiteAppService::GetAnyEmbedWindow(bool aActive, nsIDOMWindow * *aWin)
bool isActive;
br->GetIsActive(&isActive);
if (isActive) {
nsCOMPtr<nsIDOMWindow> domWindow;
nsCOMPtr<mozIDOMWindowProxy> domWindow;
br->GetContentDOMWindow(getter_AddRefs(domWindow));
*aWin = domWindow.forget().take();
if (!domWindow) {
return NS_ERROR_NOT_AVAILABLE;
}
nsCOMPtr<nsPIDOMWindowOuter> piWindow = nsPIDOMWindowOuter::From(domWindow);
piWindow.forget(embedWindow);
return NS_OK;
}
}
Expand Down
8 changes: 4 additions & 4 deletions embedding/embedlite/modules/nsIEmbedAppService.idl
Expand Up @@ -35,7 +35,7 @@ interface nsIEmbedMessageListener : nsISupports
interface nsIEmbedAppService : nsISupports
{
// Get Embed View ID by DOMWindow
void getIDByWindow(in nsIDOMWindow aWin, [retval] out uint32_t aId);
void getIDByWindow(in mozIDOMWindowProxy aWindow, [retval] out uint32_t aId);
// Send JSON Message to Embed View with related View ID
void sendAsyncMessage(in uint32_t aId, in wstring messageName, in wstring message);
void sendSyncMessage(in uint32_t aId, in wstring messageName, in wstring message,
Expand All @@ -53,7 +53,7 @@ interface nsIEmbedAppService : nsISupports
[noscript] void removeContentListener(in uint32_t aId, in EmbedLiteContentController listener);
// Get EmbedLite nsIWebBrowser by unique ID C++ only
void getBrowserByID(in uint32_t aId, out nsIWebBrowser outBrowser);
void getContentWindowByID(in uint32_t aId, [retval] out nsIDOMWindow outWindow);
void getContentWindowByID(in uint32_t aId, [retval] out mozIDOMWindowProxy contentWindow);

// Simple interface which allow to send JSON message from XPCOM C++ components to related JS Frame script which handle this message
void sendAsyncMessageLocal(in uint32_t aId, in wstring messageName, in wstring message);
Expand All @@ -62,6 +62,6 @@ interface nsIEmbedAppService : nsISupports
void zoomToRect(in uint32_t aId, in float aX, in float aY, in float aWidth, in float aHeight);
void contentReceivedInputBlock(in uint32_t aId, in boolean aPreventDefault);
// Not sure how else to add event listener from js component without browser
void chromeEventHandler(in nsIDOMWindow aWin, [retval] out nsIDOMEventTarget eventHandler);
void getAnyEmbedWindow([optional] in boolean aActive, [retval] out nsIDOMWindow aWin);
void chromeEventHandler(in mozIDOMWindowProxy aWindow, [retval] out nsIDOMEventTarget eventHandler);
void getAnyEmbedWindow([optional] in boolean aActive, [retval] out mozIDOMWindowProxy embedWindow);
};

0 comments on commit 0c2163f

Please sign in to comment.