mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
browser(firefox): close browser when pipe disconnects (#4437)
This commit is contained in:
parent
9404d2abb6
commit
2e65f78874
@ -1,2 +1,2 @@
|
|||||||
1206
|
1207
|
||||||
Changed: yurys@chromium.org Thu 12 Nov 2020 10:23:24 AM PST
|
Changed: dgozman@gmail.com Fri Nov 13 14:41:15 PST 2020
|
||||||
|
@ -79,6 +79,8 @@ CommandLineHandler.prototype = {
|
|||||||
loadFrameScript();
|
loadFrameScript();
|
||||||
dump(`Juggler listening on ws://127.0.0.1:${this._server.port}/${token}\n`);
|
dump(`Juggler listening on ws://127.0.0.1:${this._server.port}/${token}\n`);
|
||||||
} else if (jugglerPipeFlag) {
|
} else if (jugglerPipeFlag) {
|
||||||
|
let browserHandler;
|
||||||
|
let pipeStopped = false;
|
||||||
const pipe = Cc['@mozilla.org/juggler/remotedebuggingpipe;1'].getService(Ci.nsIRemoteDebuggingPipe);
|
const pipe = Cc['@mozilla.org/juggler/remotedebuggingpipe;1'].getService(Ci.nsIRemoteDebuggingPipe);
|
||||||
const connection = {
|
const connection = {
|
||||||
QueryInterface: ChromeUtils.generateQI([Ci.nsIRemoteDebuggingPipeClient]),
|
QueryInterface: ChromeUtils.generateQI([Ci.nsIRemoteDebuggingPipeClient]),
|
||||||
@ -86,20 +88,28 @@ CommandLineHandler.prototype = {
|
|||||||
if (this.onmessage)
|
if (this.onmessage)
|
||||||
this.onmessage({ data: message });
|
this.onmessage({ data: message });
|
||||||
},
|
},
|
||||||
|
disconnected() {
|
||||||
|
if (browserHandler)
|
||||||
|
browserHandler['Browser.close']();
|
||||||
|
},
|
||||||
send(message) {
|
send(message) {
|
||||||
|
if (pipeStopped) {
|
||||||
|
// We are missing the response to Browser.close,
|
||||||
|
// but everything works fine. Once we actually need it,
|
||||||
|
// we have to stop the pipe after the response is sent.
|
||||||
|
return;
|
||||||
|
}
|
||||||
pipe.sendMessage(message);
|
pipe.sendMessage(message);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
pipe.init(connection);
|
pipe.init(connection);
|
||||||
const dispatcher = new Dispatcher(connection);
|
const dispatcher = new Dispatcher(connection);
|
||||||
const browserHandler = new BrowserHandler(dispatcher.rootSession(), dispatcher, targetRegistry, () => {
|
browserHandler = new BrowserHandler(dispatcher.rootSession(), dispatcher, targetRegistry, () => {
|
||||||
if (silent)
|
if (silent)
|
||||||
Services.startup.exitLastWindowClosingSurvivalArea();
|
Services.startup.exitLastWindowClosingSurvivalArea();
|
||||||
// Send response to the Browser.close, and then stop in the next microtask.
|
connection.onclose();
|
||||||
Promise.resolve().then(() => {
|
pipe.stop();
|
||||||
connection.onclose();
|
pipeStopped = true;
|
||||||
pipe.stop();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
dispatcher.rootSession().setHandler(browserHandler);
|
dispatcher.rootSession().setHandler(browserHandler);
|
||||||
loadFrameScript();
|
loadFrameScript();
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
interface nsIRemoteDebuggingPipeClient : nsISupports
|
interface nsIRemoteDebuggingPipeClient : nsISupports
|
||||||
{
|
{
|
||||||
void receiveMessage(in AString message);
|
void receiveMessage(in AString message);
|
||||||
|
void disconnected();
|
||||||
};
|
};
|
||||||
|
|
||||||
[scriptable, uuid(b7bfb66b-fd46-4aa2-b4ad-396177186d94)]
|
[scriptable, uuid(b7bfb66b-fd46-4aa2-b4ad-396177186d94)]
|
||||||
|
@ -151,8 +151,13 @@ void nsRemoteDebuggingPipe::ReaderLoop() {
|
|||||||
std::vector<char> line;
|
std::vector<char> line;
|
||||||
while (!m_terminated) {
|
while (!m_terminated) {
|
||||||
size_t size = ReadBytes(buffer.data(), bufSize, false);
|
size_t size = ReadBytes(buffer.data(), bufSize, false);
|
||||||
if (!size)
|
if (!size) {
|
||||||
|
nsCOMPtr<nsIRunnable> runnable = NewRunnableMethod<>(
|
||||||
|
"nsRemoteDebuggingPipe::Disconnected",
|
||||||
|
this, &nsRemoteDebuggingPipe::Disconnected);
|
||||||
|
NS_DispatchToMainThread(runnable.forget());
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
size_t start = 0;
|
size_t start = 0;
|
||||||
size_t end = line.size();
|
size_t end = line.size();
|
||||||
line.insert(line.end(), buffer.begin(), buffer.begin() + size);
|
line.insert(line.end(), buffer.begin(), buffer.begin() + size);
|
||||||
@ -191,6 +196,12 @@ void nsRemoteDebuggingPipe::ReceiveMessage(const nsCString& aMessage) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nsRemoteDebuggingPipe::Disconnected() {
|
||||||
|
MOZ_RELEASE_ASSERT(NS_IsMainThread(), "Remote debugging pipe must be used on the Main thread.");
|
||||||
|
if (mClient)
|
||||||
|
mClient->Disconnected();
|
||||||
|
}
|
||||||
|
|
||||||
nsresult nsRemoteDebuggingPipe::SendMessage(const nsAString& aMessage) {
|
nsresult nsRemoteDebuggingPipe::SendMessage(const nsAString& aMessage) {
|
||||||
MOZ_RELEASE_ASSERT(NS_IsMainThread(), "Remote debugging pipe must be used on the Main thread.");
|
MOZ_RELEASE_ASSERT(NS_IsMainThread(), "Remote debugging pipe must be used on the Main thread.");
|
||||||
if (!mClient) {
|
if (!mClient) {
|
||||||
|
@ -22,6 +22,7 @@ class nsRemoteDebuggingPipe final : public nsIRemoteDebuggingPipe {
|
|||||||
private:
|
private:
|
||||||
void ReaderLoop();
|
void ReaderLoop();
|
||||||
void ReceiveMessage(const nsCString& aMessage);
|
void ReceiveMessage(const nsCString& aMessage);
|
||||||
|
void Disconnected();
|
||||||
~nsRemoteDebuggingPipe();
|
~nsRemoteDebuggingPipe();
|
||||||
|
|
||||||
RefPtr<nsIRemoteDebuggingPipeClient> mClient;
|
RefPtr<nsIRemoteDebuggingPipeClient> mClient;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user