Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/webauthn/WebAuthnManagerBase.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "mozilla/dom/WebAuthnManagerBase.h"
8
#include "mozilla/dom/WebAuthnTransactionChild.h"
9
#include "mozilla/dom/Event.h"
10
#include "nsGlobalWindowInner.h"
11
#include "nsPIWindowRoot.h"
12
13
namespace mozilla {
14
namespace dom {
15
16
NS_NAMED_LITERAL_STRING(kDeactivateEvent, "deactivate");
17
NS_NAMED_LITERAL_STRING(kVisibilityChange, "visibilitychange");
18
19
WebAuthnManagerBase::WebAuthnManagerBase(nsPIDOMWindowInner* aParent)
20
  : mParent(aParent)
21
0
{
22
0
  MOZ_ASSERT(NS_IsMainThread());
23
0
  MOZ_ASSERT(aParent);
24
0
}
25
26
WebAuthnManagerBase::~WebAuthnManagerBase()
27
0
{
28
0
  MOZ_ASSERT(NS_IsMainThread());
29
0
}
30
31
/***********************************************************************
32
 * IPC Protocol Implementation
33
 **********************************************************************/
34
35
bool
36
WebAuthnManagerBase::MaybeCreateBackgroundActor()
37
0
{
38
0
  MOZ_ASSERT(NS_IsMainThread());
39
0
40
0
  if (mChild) {
41
0
    return true;
42
0
  }
43
0
44
0
  PBackgroundChild* actorChild = BackgroundChild::GetOrCreateForCurrentThread();
45
0
  if (NS_WARN_IF(!actorChild)) {
46
0
    return false;
47
0
  }
48
0
49
0
  RefPtr<WebAuthnTransactionChild> mgr(new WebAuthnTransactionChild(this));
50
0
  PWebAuthnTransactionChild* constructedMgr =
51
0
    actorChild->SendPWebAuthnTransactionConstructor(mgr);
52
0
53
0
  if (NS_WARN_IF(!constructedMgr)) {
54
0
    return false;
55
0
  }
56
0
57
0
  MOZ_ASSERT(constructedMgr == mgr);
58
0
  mChild = mgr.forget();
59
0
60
0
  return true;
61
0
}
62
63
void
64
WebAuthnManagerBase::ActorDestroyed()
65
0
{
66
0
  MOZ_ASSERT(NS_IsMainThread());
67
0
  mChild = nullptr;
68
0
}
69
70
/***********************************************************************
71
 * Event Handling
72
 **********************************************************************/
73
74
void
75
WebAuthnManagerBase::ListenForVisibilityEvents()
76
0
{
77
0
  MOZ_ASSERT(NS_IsMainThread());
78
0
79
0
  nsCOMPtr<nsPIDOMWindowOuter> outer = mParent->GetOuterWindow();
80
0
  if (NS_WARN_IF(!outer)) {
81
0
    return;
82
0
  }
83
0
84
0
  nsCOMPtr<EventTarget> windowRoot = outer->GetTopWindowRoot();
85
0
  if (NS_WARN_IF(!windowRoot)) {
86
0
    return;
87
0
  }
88
0
89
0
  nsresult rv = windowRoot->AddEventListener(kDeactivateEvent, this,
90
0
                                             /* use capture */ true,
91
0
                                             /* wants untrusted */ false);
92
0
  Unused << NS_WARN_IF(NS_FAILED(rv));
93
0
94
0
  rv = windowRoot->AddEventListener(kVisibilityChange, this,
95
0
                                    /* use capture */ true,
96
0
                                    /* wants untrusted */ false);
97
0
  Unused << NS_WARN_IF(NS_FAILED(rv));
98
0
}
99
100
void
101
WebAuthnManagerBase::StopListeningForVisibilityEvents()
102
0
{
103
0
  MOZ_ASSERT(NS_IsMainThread());
104
0
105
0
  nsCOMPtr<nsPIDOMWindowOuter> outer = mParent->GetOuterWindow();
106
0
  if (NS_WARN_IF(!outer)) {
107
0
    return;
108
0
  }
109
0
110
0
  nsCOMPtr<EventTarget> windowRoot = outer->GetTopWindowRoot();
111
0
  if (NS_WARN_IF(!windowRoot)) {
112
0
    return;
113
0
  }
114
0
115
0
  windowRoot->RemoveEventListener(kDeactivateEvent, this,
116
0
                                  /* use capture */ true);
117
0
  windowRoot->RemoveEventListener(kVisibilityChange, this,
118
0
                                  /* use capture */ true);
119
0
}
120
121
NS_IMETHODIMP
122
WebAuthnManagerBase::HandleEvent(Event* aEvent)
123
0
{
124
0
  MOZ_ASSERT(NS_IsMainThread());
125
0
  MOZ_ASSERT(aEvent);
126
0
127
0
  nsAutoString type;
128
0
  aEvent->GetType(type);
129
0
  if (!type.Equals(kDeactivateEvent) && !type.Equals(kVisibilityChange)) {
130
0
    return NS_ERROR_FAILURE;
131
0
  }
132
0
133
0
  // The "deactivate" event on the root window has no
134
0
  // "current inner window" and thus GetTarget() is always null.
135
0
  if (type.Equals(kVisibilityChange)) {
136
0
    nsCOMPtr<nsIDocument> doc = do_QueryInterface(aEvent->GetTarget());
137
0
    if (NS_WARN_IF(!doc) || !doc->Hidden()) {
138
0
      return NS_OK;
139
0
    }
140
0
141
0
    nsGlobalWindowInner* win = nsGlobalWindowInner::Cast(doc->GetInnerWindow());
142
0
    if (NS_WARN_IF(!win) || !win->IsTopInnerWindow()) {
143
0
      return NS_OK;
144
0
    }
145
0
  }
146
0
147
0
  CancelTransaction(NS_ERROR_DOM_ABORT_ERR);
148
0
  return NS_OK;
149
0
}
150
151
}
152
}