Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/xul/XULFrameElement.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
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "nsCOMPtr.h"
8
#include "nsIContent.h"
9
#include "nsFrameLoader.h"
10
#include "mozilla/AsyncEventDispatcher.h"
11
#include "mozilla/dom/HTMLIFrameElement.h"
12
#include "mozilla/dom/XULFrameElement.h"
13
#include "mozilla/dom/XULFrameElementBinding.h"
14
15
namespace mozilla {
16
namespace dom {
17
18
NS_IMPL_CYCLE_COLLECTION_CLASS(XULFrameElement)
19
20
0
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(XULFrameElement,
21
0
                                                  nsXULElement)
22
0
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFrameLoader);
23
0
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOpener);
24
0
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
25
26
0
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(XULFrameElement,
27
0
                                                nsXULElement)
28
0
  if (tmp->mFrameLoader) {
29
0
    tmp->mFrameLoader->Destroy();
30
0
  }
31
0
  NS_IMPL_CYCLE_COLLECTION_UNLINK(mFrameLoader, mOpener)
32
0
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
33
34
NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED(XULFrameElement,
35
                                             nsXULElement,
36
                                             nsIFrameLoaderOwner)
37
38
JSObject*
39
XULFrameElement::WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto)
40
0
{
41
0
  return XULFrameElement_Binding::Wrap(aCx, this, aGivenProto);
42
0
}
43
44
nsIDocShell*
45
XULFrameElement::GetDocShell()
46
0
{
47
0
  RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
48
0
  return frameLoader ? frameLoader->GetDocShell(IgnoreErrors()) : nullptr;
49
0
}
50
51
already_AddRefed<nsIWebNavigation>
52
XULFrameElement::GetWebNavigation()
53
0
{
54
0
  nsCOMPtr<nsIDocShell> docShell = GetDocShell();
55
0
  nsCOMPtr<nsIWebNavigation> webnav = do_QueryInterface(docShell);
56
0
  return webnav.forget();
57
0
}
58
59
already_AddRefed<nsPIDOMWindowOuter>
60
XULFrameElement::GetContentWindow()
61
0
{
62
0
  nsCOMPtr<nsIDocShell> docShell = GetDocShell();
63
0
  if (docShell) {
64
0
    nsCOMPtr<nsPIDOMWindowOuter> win = docShell->GetWindow();
65
0
    return win.forget();
66
0
  }
67
0
68
0
  return nullptr;
69
0
}
70
71
nsIDocument*
72
XULFrameElement::GetContentDocument()
73
0
{
74
0
  nsCOMPtr<nsPIDOMWindowOuter> win = GetContentWindow();
75
0
  return win ? win->GetDoc() : nullptr;
76
0
}
77
78
void
79
XULFrameElement::LoadSrc()
80
0
{
81
0
  if (!IsInUncomposedDoc() ||
82
0
      !OwnerDoc()->GetRootElement()) {
83
0
      return;
84
0
  }
85
0
  RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
86
0
  if (!frameLoader) {
87
0
    // Check if we have an opener we need to be setting
88
0
    nsCOMPtr<nsPIDOMWindowOuter> opener = mOpener;
89
0
    if (!opener) {
90
0
      // If we are a primary xul-browser, we want to take the opener property!
91
0
      nsCOMPtr<nsPIDOMWindowOuter> window = OwnerDoc()->GetWindow();
92
0
      if (AttrValueIs(kNameSpaceID_None, nsGkAtoms::primary,
93
0
                      nsGkAtoms::_true, eIgnoreCase) && window) {
94
0
        opener = window->TakeOpenerForInitialContentBrowser();
95
0
      }
96
0
    }
97
0
    mOpener = nullptr;
98
0
99
0
    // false as the last parameter so that xul:iframe/browser/editor
100
0
    // session history handling works like dynamic html:iframes.
101
0
    // Usually xul elements are used in chrome, which doesn't have
102
0
    // session history at all.
103
0
    mFrameLoader = nsFrameLoader::Create(this, opener, false);
104
0
    if (NS_WARN_IF(!mFrameLoader)) {
105
0
      return;
106
0
    }
107
0
108
0
    (new AsyncEventDispatcher(this,
109
0
                              NS_LITERAL_STRING("XULFrameLoaderCreated"),
110
0
                              CanBubble::eYes))->RunDOMEventWhenSafe();
111
0
  }
112
0
113
0
  mFrameLoader->LoadFrame(false);
114
0
}
115
116
void
117
XULFrameElement::SwapFrameLoaders(HTMLIFrameElement& aOtherLoaderOwner,
118
                                  ErrorResult& rv)
119
0
{
120
0
  aOtherLoaderOwner.SwapFrameLoaders(this, rv);
121
0
}
122
123
void
124
XULFrameElement::SwapFrameLoaders(XULFrameElement& aOtherLoaderOwner,
125
                                  ErrorResult& rv)
126
0
{
127
0
  if (&aOtherLoaderOwner == this) {
128
0
    // nothing to do
129
0
    return;
130
0
  }
131
0
132
0
  aOtherLoaderOwner.SwapFrameLoaders(this, rv);
133
0
}
134
135
void
136
XULFrameElement::SwapFrameLoaders(nsIFrameLoaderOwner* aOtherLoaderOwner,
137
                                  mozilla::ErrorResult& rv)
138
0
{
139
0
  RefPtr<nsFrameLoader> loader = GetFrameLoader();
140
0
  RefPtr<nsFrameLoader> otherLoader = aOtherLoaderOwner->GetFrameLoader();
141
0
  if (!loader || !otherLoader) {
142
0
    rv.Throw(NS_ERROR_NOT_IMPLEMENTED);
143
0
    return;
144
0
  }
145
0
146
0
  rv = loader->SwapWithOtherLoader(otherLoader, this, aOtherLoaderOwner);
147
0
}
148
149
nsresult
150
XULFrameElement::BindToTree(nsIDocument* aDocument,
151
                            nsIContent* aParent,
152
                            nsIContent* aBindingParent)
153
0
{
154
0
  nsresult rv = nsXULElement::BindToTree(aDocument, aParent, aBindingParent);
155
0
  NS_ENSURE_SUCCESS(rv, rv);
156
0
157
0
  if (aDocument) {
158
0
    NS_ASSERTION(!nsContentUtils::IsSafeToRunScript(),
159
0
                 "Missing a script blocker!");
160
0
    // We're in a document now.  Kick off the frame load.
161
0
    LoadSrc();
162
0
  }
163
0
164
0
  return NS_OK;
165
0
}
166
167
void
168
XULFrameElement::UnbindFromTree(bool aDeep, bool aNullParent)
169
0
{
170
0
  RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
171
0
  if (frameLoader) {
172
0
    frameLoader->Destroy();
173
0
  }
174
0
  mFrameLoader = nullptr;
175
0
176
0
  nsXULElement::UnbindFromTree(aDeep, aNullParent);
177
0
}
178
179
void
180
XULFrameElement::DestroyContent()
181
0
{
182
0
  RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
183
0
  if (frameLoader) {
184
0
    frameLoader->Destroy();
185
0
  }
186
0
  mFrameLoader = nullptr;
187
0
188
0
  nsXULElement::DestroyContent();
189
0
}
190
191
nsresult
192
XULFrameElement::AfterSetAttr(int32_t aNamespaceID, nsAtom* aName,
193
                              const nsAttrValue* aValue,
194
                              const nsAttrValue* aOldValue,
195
                              nsIPrincipal* aSubjectPrincipal,
196
                              bool aNotify)
197
0
{
198
0
  if (aNamespaceID == kNameSpaceID_None && aName == nsGkAtoms::src && aValue) {
199
0
    LoadSrc();
200
0
  }
201
0
202
0
  return nsXULElement::AfterSetAttr(aNamespaceID, aName,
203
0
                                    aValue, aOldValue, aSubjectPrincipal, aNotify);
204
0
}
205
206
} // namespace dom
207
} // namespace mozilla