Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 1 | // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | |
dsinclair | 4d29e78 | 2016-10-04 14:02:47 -0700 | [diff] [blame] | 7 | #include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" |
Dan Sinclair | aa403d3 | 2016-03-15 14:57:22 -0400 | [diff] [blame] | 8 | |
Tom Sepez | ffb5109 | 2019-08-09 19:27:25 +0000 | [diff] [blame] | 9 | #include <memory> |
| 10 | |
dsinclair | 41872fa | 2016-10-04 11:29:35 -0700 | [diff] [blame] | 11 | #include "core/fpdfapi/page/cpdf_page.h" |
dsinclair | 488b7ad | 2016-10-04 11:55:50 -0700 | [diff] [blame] | 12 | #include "core/fpdfapi/parser/cpdf_document.h" |
Tom Sepez | 0208b0c | 2019-07-23 21:52:50 +0000 | [diff] [blame] | 13 | #include "core/fpdfapi/render/cpdf_pagerendercache.h" |
Tom Sepez | ffb5109 | 2019-08-09 19:27:25 +0000 | [diff] [blame] | 14 | #include "fpdfsdk/cpdfsdk_pageview.h" |
dsinclair | 521b750 | 2016-11-02 13:02:28 -0700 | [diff] [blame] | 15 | #include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" |
Tom Sepez | 451ed2d | 2019-08-19 22:55:31 +0000 | [diff] [blame] | 16 | #include "fpdfsdk/fpdfxfa/cpdfxfa_widget.h" |
Tom Sepez | ffb5109 | 2019-08-09 19:27:25 +0000 | [diff] [blame] | 17 | #include "third_party/base/ptr_util.h" |
Dan Sinclair | 80c4878 | 2017-03-23 12:11:20 -0400 | [diff] [blame] | 18 | #include "xfa/fxfa/cxfa_ffdocview.h" |
| 19 | #include "xfa/fxfa/cxfa_ffpageview.h" |
Tom Sepez | bcb7a69 | 2019-08-09 21:21:09 +0000 | [diff] [blame] | 20 | #include "xfa/fxfa/cxfa_ffwidget.h" |
Tom Sepez | 66497fe | 2019-08-09 20:55:06 +0000 | [diff] [blame] | 21 | #include "xfa/fxfa/cxfa_ffwidgethandler.h" |
| 22 | #include "xfa/fxfa/cxfa_rendercontext.h" |
| 23 | #include "xfa/fxgraphics/cxfa_graphics.h" |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 24 | |
Tom Sepez | 9bf0181 | 2019-08-19 18:59:27 +0000 | [diff] [blame] | 25 | CPDFXFA_Page::CPDFXFA_Page(CPDF_Document* pDocument, int page_index) |
| 26 | : m_pDocument(pDocument), m_iPageIndex(page_index) { |
| 27 | ASSERT(m_pDocument->GetExtension()); |
Lei Zhang | 30540a9 | 2018-10-04 22:31:12 +0000 | [diff] [blame] | 28 | ASSERT(m_iPageIndex >= 0); |
| 29 | } |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 30 | |
Lei Zhang | 30540a9 | 2018-10-04 22:31:12 +0000 | [diff] [blame] | 31 | CPDFXFA_Page::~CPDFXFA_Page() = default; |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 32 | |
Tom Sepez | 101535f | 2018-06-12 13:36:05 +0000 | [diff] [blame] | 33 | CPDF_Page* CPDFXFA_Page::AsPDFPage() { |
| 34 | return m_pPDFPage.Get(); |
| 35 | } |
| 36 | |
| 37 | CPDFXFA_Page* CPDFXFA_Page::AsXFAPage() { |
| 38 | return this; |
| 39 | } |
| 40 | |
| 41 | CPDF_Document* CPDFXFA_Page::GetDocument() const { |
Tom Sepez | 9bf0181 | 2019-08-19 18:59:27 +0000 | [diff] [blame] | 42 | return m_pDocument.Get(); |
Tom Sepez | 101535f | 2018-06-12 13:36:05 +0000 | [diff] [blame] | 43 | } |
| 44 | |
Henrique Nakashima | 7b094f8 | 2018-05-08 20:32:08 +0000 | [diff] [blame] | 45 | bool CPDFXFA_Page::LoadPDFPage() { |
Lei Zhang | 30540a9 | 2018-10-04 22:31:12 +0000 | [diff] [blame] | 46 | CPDF_Document* pPDFDoc = GetDocument(); |
Henrique Nakashima | 7b094f8 | 2018-05-08 20:32:08 +0000 | [diff] [blame] | 47 | CPDF_Dictionary* pDict = pPDFDoc->GetPageDictionary(m_iPageIndex); |
| 48 | if (!pDict) |
| 49 | return false; |
| 50 | |
Tom Sepez | 0208b0c | 2019-07-23 21:52:50 +0000 | [diff] [blame] | 51 | if (!m_pPDFPage || m_pPDFPage->GetDict() != pDict) |
| 52 | LoadPDFPageFromDict(pDict); |
| 53 | |
Henrique Nakashima | 7b094f8 | 2018-05-08 20:32:08 +0000 | [diff] [blame] | 54 | return true; |
| 55 | } |
| 56 | |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 57 | CXFA_FFPageView* CPDFXFA_Page::GetXFAPageView() const { |
Tom Sepez | 9bf0181 | 2019-08-19 18:59:27 +0000 | [diff] [blame] | 58 | auto* pContext = static_cast<CPDFXFA_Context*>(m_pDocument->GetExtension()); |
| 59 | CXFA_FFDocView* pXFADocView = pContext->GetXFADocView(); |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 60 | return pXFADocView ? pXFADocView->GetPageView(m_iPageIndex) : nullptr; |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 61 | } |
| 62 | |
Henrique Nakashima | 7b094f8 | 2018-05-08 20:32:08 +0000 | [diff] [blame] | 63 | bool CPDFXFA_Page::LoadPage() { |
Tom Sepez | 9bf0181 | 2019-08-19 18:59:27 +0000 | [diff] [blame] | 64 | auto* pContext = static_cast<CPDFXFA_Context*>(m_pDocument->GetExtension()); |
| 65 | switch (pContext->GetFormType()) { |
Henrique Nakashima | 7b094f8 | 2018-05-08 20:32:08 +0000 | [diff] [blame] | 66 | case FormType::kNone: |
| 67 | case FormType::kAcroForm: |
| 68 | case FormType::kXFAForeground: |
| 69 | return LoadPDFPage(); |
| 70 | case FormType::kXFAFull: |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 71 | return !!GetXFAPageView(); |
Henrique Nakashima | 7b094f8 | 2018-05-08 20:32:08 +0000 | [diff] [blame] | 72 | } |
Lei Zhang | 30540a9 | 2018-10-04 22:31:12 +0000 | [diff] [blame] | 73 | NOTREACHED(); |
Henrique Nakashima | 7b094f8 | 2018-05-08 20:32:08 +0000 | [diff] [blame] | 74 | return false; |
| 75 | } |
| 76 | |
Lei Zhang | 30540a9 | 2018-10-04 22:31:12 +0000 | [diff] [blame] | 77 | void CPDFXFA_Page::LoadPDFPageFromDict(CPDF_Dictionary* pPageDict) { |
| 78 | ASSERT(pPageDict); |
Tom Sepez | 0208b0c | 2019-07-23 21:52:50 +0000 | [diff] [blame] | 79 | m_pPDFPage = pdfium::MakeRetain<CPDF_Page>(GetDocument(), pPageDict); |
| 80 | m_pPDFPage->SetRenderCache( |
| 81 | pdfium::MakeUnique<CPDF_PageRenderCache>(m_pPDFPage.Get())); |
Tom Sepez | f06ed6d | 2018-06-04 18:26:07 +0000 | [diff] [blame] | 82 | m_pPDFPage->ParseContent(); |
Henrique Nakashima | 7b094f8 | 2018-05-08 20:32:08 +0000 | [diff] [blame] | 83 | } |
| 84 | |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 85 | float CPDFXFA_Page::GetPageWidth() const { |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 86 | CXFA_FFPageView* pPageView = GetXFAPageView(); |
| 87 | if (!m_pPDFPage && !pPageView) |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 88 | return 0.0f; |
| 89 | |
Tom Sepez | 9bf0181 | 2019-08-19 18:59:27 +0000 | [diff] [blame] | 90 | auto* pContext = static_cast<CPDFXFA_Context*>(m_pDocument->GetExtension()); |
| 91 | switch (pContext->GetFormType()) { |
Ryan Harrison | 854d71c | 2017-10-18 12:28:14 -0400 | [diff] [blame] | 92 | case FormType::kNone: |
| 93 | case FormType::kAcroForm: |
| 94 | case FormType::kXFAForeground: |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 95 | if (m_pPDFPage) |
| 96 | return m_pPDFPage->GetPageWidth(); |
Lei Zhang | db3c6ce | 2018-05-17 02:01:42 +0000 | [diff] [blame] | 97 | FALLTHROUGH; |
Ryan Harrison | 854d71c | 2017-10-18 12:28:14 -0400 | [diff] [blame] | 98 | case FormType::kXFAFull: |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 99 | if (pPageView) |
| 100 | return pPageView->GetPageViewRect().width; |
Henrique Nakashima | 067a44f | 2018-02-16 03:46:28 +0000 | [diff] [blame] | 101 | break; |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 102 | } |
| 103 | |
| 104 | return 0.0f; |
| 105 | } |
| 106 | |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 107 | float CPDFXFA_Page::GetPageHeight() const { |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 108 | CXFA_FFPageView* pPageView = GetXFAPageView(); |
| 109 | if (!m_pPDFPage && !pPageView) |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 110 | return 0.0f; |
| 111 | |
Tom Sepez | 9bf0181 | 2019-08-19 18:59:27 +0000 | [diff] [blame] | 112 | auto* pContext = static_cast<CPDFXFA_Context*>(m_pDocument->GetExtension()); |
| 113 | switch (pContext->GetFormType()) { |
Ryan Harrison | 854d71c | 2017-10-18 12:28:14 -0400 | [diff] [blame] | 114 | case FormType::kNone: |
| 115 | case FormType::kAcroForm: |
| 116 | case FormType::kXFAForeground: |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 117 | if (m_pPDFPage) |
| 118 | return m_pPDFPage->GetPageHeight(); |
Lei Zhang | db3c6ce | 2018-05-17 02:01:42 +0000 | [diff] [blame] | 119 | FALLTHROUGH; |
Ryan Harrison | 854d71c | 2017-10-18 12:28:14 -0400 | [diff] [blame] | 120 | case FormType::kXFAFull: |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 121 | if (pPageView) |
| 122 | return pPageView->GetPageViewRect().height; |
Henrique Nakashima | 067a44f | 2018-02-16 03:46:28 +0000 | [diff] [blame] | 123 | break; |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 124 | } |
| 125 | |
| 126 | return 0.0f; |
| 127 | } |
| 128 | |
Lei Zhang | 822886b | 2018-04-12 17:24:45 +0000 | [diff] [blame] | 129 | Optional<CFX_PointF> CPDFXFA_Page::DeviceToPage( |
| 130 | const FX_RECT& rect, |
| 131 | int rotate, |
| 132 | const CFX_PointF& device_point) const { |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 133 | CXFA_FFPageView* pPageView = GetXFAPageView(); |
| 134 | if (!m_pPDFPage && !pPageView) |
Lei Zhang | 822886b | 2018-04-12 17:24:45 +0000 | [diff] [blame] | 135 | return {}; |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 136 | |
Lei Zhang | a105fa1 | 2018-04-12 16:23:01 +0000 | [diff] [blame] | 137 | CFX_PointF pos = |
| 138 | GetDisplayMatrix(rect, rotate).GetInverse().Transform(device_point); |
Lei Zhang | 822886b | 2018-04-12 17:24:45 +0000 | [diff] [blame] | 139 | return pos; |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 140 | } |
| 141 | |
Lei Zhang | a8db06a | 2018-04-12 17:53:15 +0000 | [diff] [blame] | 142 | Optional<CFX_PointF> CPDFXFA_Page::PageToDevice( |
| 143 | const FX_RECT& rect, |
| 144 | int rotate, |
| 145 | const CFX_PointF& page_point) const { |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 146 | CXFA_FFPageView* pPageView = GetXFAPageView(); |
| 147 | if (!m_pPDFPage && !pPageView) |
Lei Zhang | 822886b | 2018-04-12 17:24:45 +0000 | [diff] [blame] | 148 | return {}; |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 149 | |
Lei Zhang | c4242b2 | 2018-04-12 15:50:49 +0000 | [diff] [blame] | 150 | CFX_Matrix page2device = GetDisplayMatrix(rect, rotate); |
Lei Zhang | a8db06a | 2018-04-12 17:53:15 +0000 | [diff] [blame] | 151 | return page2device.Transform(page_point); |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 152 | } |
| 153 | |
Lei Zhang | c4242b2 | 2018-04-12 15:50:49 +0000 | [diff] [blame] | 154 | CFX_Matrix CPDFXFA_Page::GetDisplayMatrix(const FX_RECT& rect, |
Dan Sinclair | 1b08df1 | 2017-02-09 09:17:20 -0500 | [diff] [blame] | 155 | int iRotate) const { |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 156 | CXFA_FFPageView* pPageView = GetXFAPageView(); |
| 157 | if (!m_pPDFPage && !pPageView) |
Dan Sinclair | 1b08df1 | 2017-02-09 09:17:20 -0500 | [diff] [blame] | 158 | return CFX_Matrix(); |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 159 | |
Tom Sepez | 9bf0181 | 2019-08-19 18:59:27 +0000 | [diff] [blame] | 160 | auto* pContext = static_cast<CPDFXFA_Context*>(m_pDocument->GetExtension()); |
| 161 | switch (pContext->GetFormType()) { |
Ryan Harrison | 854d71c | 2017-10-18 12:28:14 -0400 | [diff] [blame] | 162 | case FormType::kNone: |
| 163 | case FormType::kAcroForm: |
| 164 | case FormType::kXFAForeground: |
Dan Sinclair | 1b08df1 | 2017-02-09 09:17:20 -0500 | [diff] [blame] | 165 | if (m_pPDFPage) |
Lei Zhang | c4242b2 | 2018-04-12 15:50:49 +0000 | [diff] [blame] | 166 | return m_pPDFPage->GetDisplayMatrix(rect, iRotate); |
Lei Zhang | db3c6ce | 2018-05-17 02:01:42 +0000 | [diff] [blame] | 167 | FALLTHROUGH; |
Ryan Harrison | 854d71c | 2017-10-18 12:28:14 -0400 | [diff] [blame] | 168 | case FormType::kXFAFull: |
Tom Sepez | 4ae5235 | 2019-01-07 20:39:29 +0000 | [diff] [blame] | 169 | if (pPageView) |
| 170 | return pPageView->GetDisplayMatrix(rect, iRotate); |
Henrique Nakashima | 067a44f | 2018-02-16 03:46:28 +0000 | [diff] [blame] | 171 | break; |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 172 | } |
Ryan Harrison | 854d71c | 2017-10-18 12:28:14 -0400 | [diff] [blame] | 173 | |
Dan Sinclair | 1b08df1 | 2017-02-09 09:17:20 -0500 | [diff] [blame] | 174 | return CFX_Matrix(); |
Lei Zhang | 9429368 | 2016-01-27 18:27:56 -0800 | [diff] [blame] | 175 | } |
Tom Sepez | ffb5109 | 2019-08-09 19:27:25 +0000 | [diff] [blame] | 176 | |
| 177 | CPDFSDK_Annot* CPDFXFA_Page::GetNextXFAAnnot(CPDFSDK_Annot* pSDKAnnot, |
| 178 | bool bNext) { |
Tom Sepez | 451ed2d | 2019-08-19 22:55:31 +0000 | [diff] [blame] | 179 | CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pSDKAnnot); |
| 180 | if (!pXFAWidget) |
| 181 | return nullptr; |
| 182 | |
Tom Sepez | ffb5109 | 2019-08-09 19:27:25 +0000 | [diff] [blame] | 183 | ObservedPtr<CPDFSDK_Annot> pObservedAnnot(pSDKAnnot); |
| 184 | CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView(); |
| 185 | std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator( |
| 186 | GetXFAPageView()->CreateWidgetIterator(XFA_TRAVERSEWAY_Tranvalse, |
| 187 | XFA_WidgetStatus_Visible | |
| 188 | XFA_WidgetStatus_Viewable | |
| 189 | XFA_WidgetStatus_Focused)); |
| 190 | |
| 191 | // Check |pSDKAnnot| again because JS may have destroyed it |
| 192 | if (!pObservedAnnot || !pWidgetIterator) |
| 193 | return nullptr; |
| 194 | |
Tom Sepez | 451ed2d | 2019-08-19 22:55:31 +0000 | [diff] [blame] | 195 | if (pWidgetIterator->GetCurrentWidget() != pXFAWidget->GetXFAFFWidget()) |
| 196 | pWidgetIterator->SetCurrentWidget(pXFAWidget->GetXFAFFWidget()); |
| 197 | |
Tom Sepez | ffb5109 | 2019-08-09 19:27:25 +0000 | [diff] [blame] | 198 | CXFA_FFWidget* hNextFocus = |
| 199 | bNext ? pWidgetIterator->MoveToNext() : pWidgetIterator->MoveToPrevious(); |
| 200 | if (!hNextFocus && pSDKAnnot) |
| 201 | hNextFocus = pWidgetIterator->MoveToFirst(); |
| 202 | |
| 203 | return pPageView->GetAnnotByXFAWidget(hNextFocus); |
| 204 | } |
Tom Sepez | 66497fe | 2019-08-09 20:55:06 +0000 | [diff] [blame] | 205 | |
Tom Sepez | bcb7a69 | 2019-08-09 21:21:09 +0000 | [diff] [blame] | 206 | int CPDFXFA_Page::HasFormFieldAtPoint(const CFX_PointF& point) const { |
| 207 | CXFA_FFPageView* pPageView = GetXFAPageView(); |
| 208 | if (!pPageView) |
| 209 | return -1; |
| 210 | |
| 211 | CXFA_FFDocView* pDocView = pPageView->GetDocView(); |
| 212 | if (!pDocView) |
| 213 | return -1; |
| 214 | |
| 215 | CXFA_FFWidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); |
| 216 | if (!pWidgetHandler) |
| 217 | return -1; |
| 218 | |
| 219 | std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator( |
| 220 | pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form, |
| 221 | XFA_WidgetStatus_Viewable)); |
| 222 | if (!pWidgetIterator) |
| 223 | return -1; |
| 224 | |
| 225 | CXFA_FFWidget* pXFAAnnot; |
| 226 | while ((pXFAAnnot = pWidgetIterator->MoveToNext()) != nullptr) { |
| 227 | if (pXFAAnnot->GetFormFieldType() == FormFieldType::kXFA) |
| 228 | continue; |
| 229 | |
| 230 | CFX_FloatRect rcWidget = pXFAAnnot->GetWidgetRect().ToFloatRect(); |
| 231 | rcWidget.Inflate(1.0f, 1.0f); |
| 232 | if (rcWidget.Contains(point)) |
| 233 | return static_cast<int>(pXFAAnnot->GetFormFieldType()); |
| 234 | } |
| 235 | |
| 236 | return -1; |
| 237 | } |
| 238 | |
Tom Sepez | 66497fe | 2019-08-09 20:55:06 +0000 | [diff] [blame] | 239 | void CPDFXFA_Page::DrawFocusAnnot(CFX_RenderDevice* pDevice, |
| 240 | CPDFSDK_Annot* pAnnot, |
| 241 | const CFX_Matrix& mtUser2Device, |
| 242 | const FX_RECT& rtClip) { |
Tom Sepez | a0624a0 | 2019-08-09 22:12:09 +0000 | [diff] [blame] | 243 | CFX_RectF rectClip(rtClip); |
Tom Sepez | 66497fe | 2019-08-09 20:55:06 +0000 | [diff] [blame] | 244 | CXFA_Graphics gs(pDevice); |
| 245 | gs.SetClipRect(rectClip); |
| 246 | |
| 247 | CXFA_FFPageView* xfaView = GetXFAPageView(); |
| 248 | CXFA_RenderContext renderContext(xfaView, rectClip, mtUser2Device); |
| 249 | renderContext.DoRender(&gs); |
| 250 | |
Tom Sepez | 451ed2d | 2019-08-19 22:55:31 +0000 | [diff] [blame] | 251 | CPDFXFA_Widget* pXFAWidget = ToXFAWidget(pAnnot); |
| 252 | if (!pXFAWidget) |
Tom Sepez | 66497fe | 2019-08-09 20:55:06 +0000 | [diff] [blame] | 253 | return; |
| 254 | |
| 255 | CXFA_FFDocView* docView = xfaView->GetDocView(); |
| 256 | if (!docView) |
| 257 | return; |
| 258 | |
Tom Sepez | 451ed2d | 2019-08-19 22:55:31 +0000 | [diff] [blame] | 259 | docView->GetWidgetHandler()->RenderWidget(pXFAWidget->GetXFAFFWidget(), &gs, |
Tom Sepez | 66497fe | 2019-08-09 20:55:06 +0000 | [diff] [blame] | 260 | mtUser2Device, false); |
| 261 | } |