1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "GeckoViewExternalAppService.h"
#include "mozilla/dom/BrowsingContext.h"
#include "mozilla/dom/CanonicalBrowsingContext.h"
#include "mozilla/dom/WindowGlobalParent.h"
#include "nsIChannel.h"
#include "mozilla/widget/EventDispatcher.h"
#include "mozilla/widget/nsWindow.h"
#include "GeckoViewStreamListener.h"
#include "JavaBuiltins.h"
class StreamListener final : public mozilla::GeckoViewStreamListener {
public:
explicit StreamListener(nsWindow* aWindow)
: GeckoViewStreamListener(), mWindow(aWindow) {}
void SendWebResponse(mozilla::java::WebResponse::Param aResponse) {
mWindow->PassExternalResponse(aResponse);
}
void CompleteWithError(nsresult aStatus, nsIChannel* aChannel) {
// Currently we don't do anything about errors here
}
virtual ~StreamListener() {}
private:
RefPtr<nsWindow> mWindow;
};
mozilla::StaticRefPtr<GeckoViewExternalAppService>
GeckoViewExternalAppService::sService;
/* static */
already_AddRefed<GeckoViewExternalAppService>
GeckoViewExternalAppService::GetSingleton() {
if (!sService) {
sService = new GeckoViewExternalAppService();
}
RefPtr<GeckoViewExternalAppService> service = sService;
return service.forget();
}
GeckoViewExternalAppService::GeckoViewExternalAppService() {}
NS_IMPL_ISUPPORTS(GeckoViewExternalAppService, nsIExternalHelperAppService);
NS_IMETHODIMP GeckoViewExternalAppService::DoContent(
const nsACString& aMimeContentType, nsIChannel* aChannel,
nsIInterfaceRequestor* aContentContext, bool aForceSave,
nsIInterfaceRequestor* aWindowContext,
nsIStreamListener** aStreamListener) {
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP GeckoViewExternalAppService::CreateListener(
const nsACString& aMimeContentType, nsIChannel* aChannel,
mozilla::dom::BrowsingContext* aContentContext, bool aForceSave,
nsIInterfaceRequestor* aWindowContext,
nsIStreamListener** aStreamListener) {
using namespace mozilla;
using namespace mozilla::dom;
MOZ_ASSERT(XRE_IsParentProcess());
NS_ENSURE_ARG_POINTER(aChannel);
nsCOMPtr<nsIWidget> widget =
aContentContext->Canonical()->GetParentProcessWidgetContaining();
if (!widget) {
return NS_ERROR_ABORT;
}
RefPtr<nsWindow> window = nsWindow::From(widget);
MOZ_ASSERT(window);
RefPtr<StreamListener> listener = new StreamListener(window);
nsresult rv;
rv = aChannel->SetNotificationCallbacks(listener);
NS_ENSURE_SUCCESS(rv, rv);
listener.forget(aStreamListener);
return NS_OK;
}
NS_IMETHODIMP GeckoViewExternalAppService::ApplyDecodingForExtension(
const nsACString& aExtension, const nsACString& aEncodingType,
bool* aApplyDecoding) {
// This currently doesn't matter, because we never read the stream.
*aApplyDecoding = true;
return NS_OK;
}
|