Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/image/decoders/icon/nsIconURI.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2
 * vim: set sw=2 sts=2 ts=2 et tw=80:
3
 *
4
 * This Source Code Form is subject to the terms of the Mozilla Public
5
 * License, v. 2.0. If a copy of the MPL was not distributed with this
6
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8
#include "nsIconURI.h"
9
10
#include "mozilla/ArrayUtils.h"
11
#include "mozilla/ipc/URIUtils.h"
12
#include "mozilla/Sprintf.h"
13
14
#include "nsIIOService.h"
15
#include "nsIURL.h"
16
#include "nsNetUtil.h"
17
#include "plstr.h"
18
#include <stdlib.h>
19
20
using namespace mozilla;
21
using namespace mozilla::ipc;
22
23
0
#define DEFAULT_IMAGE_SIZE 16
24
25
#if defined(MAX_PATH)
26
#define SANE_FILE_NAME_LEN MAX_PATH
27
#elif defined(PATH_MAX)
28
0
#define SANE_FILE_NAME_LEN PATH_MAX
29
#else
30
#define SANE_FILE_NAME_LEN 1024
31
#endif
32
33
// helper function for parsing out attributes like size, and contentType
34
// from the icon url.
35
static void extractAttributeValue(const char* aSearchString,
36
                                  const char* aAttributeName,
37
                                  nsCString& aResult);
38
39
static const char* kSizeStrings[] =
40
{
41
  "button",
42
  "toolbar",
43
  "toolbarsmall",
44
  "menu",
45
  "dnd",
46
  "dialog"
47
};
48
49
static const char* kStateStrings[] =
50
{
51
  "normal",
52
  "disabled"
53
};
54
55
////////////////////////////////////////////////////////////////////////////////
56
57
nsMozIconURI::nsMozIconURI()
58
  : mSize(DEFAULT_IMAGE_SIZE),
59
    mIconSize(-1),
60
    mIconState(-1)
61
0
{ }
62
63
nsMozIconURI::~nsMozIconURI()
64
0
{ }
65
66
NS_IMPL_ADDREF(nsMozIconURI)
67
NS_IMPL_RELEASE(nsMozIconURI)
68
69
0
NS_INTERFACE_MAP_BEGIN(nsMozIconURI)
70
0
  NS_INTERFACE_MAP_ENTRY(nsIMozIconURI)
71
0
  NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIURI)
72
0
  NS_INTERFACE_MAP_ENTRY(nsIURI)
73
0
  NS_INTERFACE_MAP_ENTRY(nsIIPCSerializableURI)
74
0
  NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsINestedURI, mIconURL)
75
0
NS_INTERFACE_MAP_END
76
77
0
#define MOZICON_SCHEME "moz-icon:"
78
0
#define MOZICON_SCHEME_LEN (sizeof(MOZICON_SCHEME) - 1)
79
80
////////////////////////////////////////////////////////////////////////////////
81
// nsIURI methods:
82
83
NS_IMETHODIMP
84
nsMozIconURI::GetSpec(nsACString& aSpec)
85
0
{
86
0
  aSpec = MOZICON_SCHEME;
87
0
88
0
  if (mIconURL) {
89
0
    nsAutoCString fileIconSpec;
90
0
    nsresult rv = mIconURL->GetSpec(fileIconSpec);
91
0
    NS_ENSURE_SUCCESS(rv, rv);
92
0
    aSpec += fileIconSpec;
93
0
  } else if (!mStockIcon.IsEmpty()) {
94
0
    aSpec += "//stock/";
95
0
    aSpec += mStockIcon;
96
0
  } else {
97
0
    aSpec += "//";
98
0
    aSpec += mFileName;
99
0
  }
100
0
101
0
  aSpec += "?size=";
102
0
  if (mIconSize >= 0) {
103
0
    aSpec += kSizeStrings[mIconSize];
104
0
  } else {
105
0
    char buf[20];
106
0
    SprintfLiteral(buf, "%d", mSize);
107
0
    aSpec.Append(buf);
108
0
  }
109
0
110
0
  if (mIconState >= 0) {
111
0
    aSpec += "&state=";
112
0
    aSpec += kStateStrings[mIconState];
113
0
  }
114
0
115
0
  if (!mContentType.IsEmpty()) {
116
0
    aSpec += "&contentType=";
117
0
    aSpec += mContentType.get();
118
0
  }
119
0
120
0
  return NS_OK;
121
0
}
122
123
NS_IMETHODIMP
124
nsMozIconURI::GetSpecIgnoringRef(nsACString& result)
125
0
{
126
0
  return GetSpec(result);
127
0
}
128
129
NS_IMETHODIMP
130
nsMozIconURI::GetDisplaySpec(nsACString& aUnicodeSpec)
131
0
{
132
0
  return GetSpec(aUnicodeSpec);
133
0
}
134
135
NS_IMETHODIMP
136
nsMozIconURI::GetDisplayHostPort(nsACString& aUnicodeHostPort)
137
0
{
138
0
  return GetHostPort(aUnicodeHostPort);
139
0
}
140
141
NS_IMETHODIMP
142
nsMozIconURI::GetDisplayHost(nsACString& aUnicodeHost)
143
0
{
144
0
  return GetHost(aUnicodeHost);
145
0
}
146
147
NS_IMETHODIMP
148
nsMozIconURI::GetDisplayPrePath(nsACString& aPrePath)
149
0
{
150
0
  return GetPrePath(aPrePath);
151
0
}
152
153
NS_IMETHODIMP
154
nsMozIconURI::GetHasRef(bool* result)
155
0
{
156
0
  *result = false;
157
0
  return NS_OK;
158
0
}
159
160
NS_IMPL_ISUPPORTS(nsMozIconURI::Mutator, nsIURISetters, nsIURIMutator)
161
162
NS_IMETHODIMP
163
nsMozIconURI::Mutate(nsIURIMutator** aMutator)
164
0
{
165
0
    RefPtr<nsMozIconURI::Mutator> mutator = new nsMozIconURI::Mutator();
166
0
    nsresult rv = mutator->InitFromURI(this);
167
0
    if (NS_FAILED(rv)) {
168
0
        return rv;
169
0
    }
170
0
    mutator.forget(aMutator);
171
0
    return NS_OK;
172
0
}
173
174
// takes a string like ?size=32&contentType=text/html and returns a new string
175
// containing just the attribute value. i.e you could pass in this string with
176
// an attribute name of 'size=', this will return 32
177
// Assumption: attribute pairs in the string are separated by '&'.
178
void
179
extractAttributeValue(const char* aSearchString,
180
                           const char* aAttributeName,
181
                           nsCString& aResult)
182
0
{
183
0
  //NS_ENSURE_ARG_POINTER(extractAttributeValue);
184
0
185
0
  aResult.Truncate();
186
0
187
0
  if (aSearchString && aAttributeName) {
188
0
    // search the string for attributeName
189
0
    uint32_t attributeNameSize = strlen(aAttributeName);
190
0
    const char* startOfAttribute = PL_strcasestr(aSearchString, aAttributeName);
191
0
    if (startOfAttribute &&
192
0
       ( *(startOfAttribute-1) == '?' || *(startOfAttribute-1) == '&') ) {
193
0
      startOfAttribute += attributeNameSize; // skip over the attributeName
194
0
      // is there something after the attribute name
195
0
      if (*startOfAttribute) {
196
0
        const char* endofAttribute = strchr(startOfAttribute, '&');
197
0
        if (endofAttribute) {
198
0
          aResult.Assign(Substring(startOfAttribute, endofAttribute));
199
0
        } else {
200
0
          aResult.Assign(startOfAttribute);
201
0
        }
202
0
      } // if we have a attribute value
203
0
    } // if we have a attribute name
204
0
  } // if we got non-null search string and attribute name values
205
0
}
206
207
nsresult
208
nsMozIconURI::SetSpecInternal(const nsACString& aSpec)
209
0
{
210
0
  // Reset everything to default values.
211
0
  mIconURL = nullptr;
212
0
  mSize = DEFAULT_IMAGE_SIZE;
213
0
  mContentType.Truncate();
214
0
  mFileName.Truncate();
215
0
  mStockIcon.Truncate();
216
0
  mIconSize = -1;
217
0
  mIconState = -1;
218
0
219
0
  nsAutoCString iconSpec(aSpec);
220
0
  if (!Substring(iconSpec, 0,
221
0
                 MOZICON_SCHEME_LEN).EqualsLiteral(MOZICON_SCHEME) ||
222
0
      (!Substring(iconSpec, MOZICON_SCHEME_LEN, 7).EqualsLiteral("file://") &&
223
0
       // Checking for the leading '//' will match both the '//stock/' and '//.foo' cases:
224
0
       !Substring(iconSpec, MOZICON_SCHEME_LEN, 2).EqualsLiteral("//"))) {
225
0
    return NS_ERROR_MALFORMED_URI;
226
0
  }
227
0
228
0
  int32_t questionMarkPos = iconSpec.Find("?");
229
0
  if (questionMarkPos != -1 &&
230
0
      static_cast<int32_t>(iconSpec.Length()) > (questionMarkPos + 1)) {
231
0
    extractAttributeValue(iconSpec.get(), "contentType=", mContentType);
232
0
233
0
    nsAutoCString sizeString;
234
0
    extractAttributeValue(iconSpec.get(), "size=", sizeString);
235
0
    if (!sizeString.IsEmpty()) {
236
0
      const char* sizeStr = sizeString.get();
237
0
      for (uint32_t i = 0; i < ArrayLength(kSizeStrings); i++) {
238
0
        if (PL_strcasecmp(sizeStr, kSizeStrings[i]) == 0) {
239
0
          mIconSize = i;
240
0
          break;
241
0
        }
242
0
      }
243
0
244
0
      int32_t sizeValue = atoi(sizeString.get());
245
0
      if (sizeValue > 0) {
246
0
        mSize = sizeValue;
247
0
      }
248
0
    }
249
0
250
0
    nsAutoCString stateString;
251
0
    extractAttributeValue(iconSpec.get(), "state=", stateString);
252
0
    if (!stateString.IsEmpty()) {
253
0
      const char* stateStr = stateString.get();
254
0
      for (uint32_t i = 0; i < ArrayLength(kStateStrings); i++) {
255
0
        if (PL_strcasecmp(stateStr, kStateStrings[i]) == 0) {
256
0
          mIconState = i;
257
0
          break;
258
0
        }
259
0
      }
260
0
    }
261
0
  }
262
0
263
0
  int32_t pathLength = iconSpec.Length() - MOZICON_SCHEME_LEN;
264
0
  if (questionMarkPos != -1) {
265
0
    pathLength = questionMarkPos - MOZICON_SCHEME_LEN;
266
0
  }
267
0
  if (pathLength < 3) {
268
0
    return NS_ERROR_MALFORMED_URI;
269
0
  }
270
0
271
0
  nsAutoCString iconPath(Substring(iconSpec, MOZICON_SCHEME_LEN, pathLength));
272
0
273
0
  // Icon URI path can have three forms:
274
0
  // (1) //stock/<icon-identifier>
275
0
  // (2) //<some dummy file with an extension>
276
0
  // (3) a valid URL
277
0
278
0
  if (!strncmp("//stock/", iconPath.get(), 8)) {
279
0
    mStockIcon.Assign(Substring(iconPath, 8));
280
0
    // An icon identifier must always be specified.
281
0
    if (mStockIcon.IsEmpty()) {
282
0
      return NS_ERROR_MALFORMED_URI;
283
0
    }
284
0
    return NS_OK;
285
0
  }
286
0
287
0
  if (StringBeginsWith(iconPath, NS_LITERAL_CSTRING("//"))) {
288
0
    // Sanity check this supposed dummy file name.
289
0
    if (iconPath.Length() > SANE_FILE_NAME_LEN) {
290
0
      return NS_ERROR_MALFORMED_URI;
291
0
    }
292
0
    iconPath.Cut(0, 2);
293
0
    mFileName.Assign(iconPath);
294
0
  }
295
0
296
0
  nsresult rv;
297
0
  nsCOMPtr<nsIIOService> ioService(do_GetService(NS_IOSERVICE_CONTRACTID, &rv));
298
0
  NS_ENSURE_SUCCESS(rv, rv);
299
0
300
0
  nsCOMPtr<nsIURI> uri;
301
0
  ioService->NewURI(iconPath, nullptr, nullptr, getter_AddRefs(uri));
302
0
  mIconURL = do_QueryInterface(uri);
303
0
  if (mIconURL) {
304
0
    // The inner URI should be a 'file:' one. If not, bail.
305
0
    bool isFile = false;
306
0
    if (!NS_SUCCEEDED(mIconURL->SchemeIs("file", &isFile)) || !isFile) {
307
0
      return NS_ERROR_MALFORMED_URI;
308
0
    }
309
0
    mFileName.Truncate();
310
0
  } else if (mFileName.IsEmpty()) {
311
0
    return NS_ERROR_MALFORMED_URI;
312
0
  }
313
0
314
0
  return NS_OK;
315
0
}
316
317
NS_IMETHODIMP
318
nsMozIconURI::GetPrePath(nsACString& prePath)
319
0
{
320
0
  prePath = MOZICON_SCHEME;
321
0
  return NS_OK;
322
0
}
323
324
NS_IMETHODIMP
325
nsMozIconURI::GetScheme(nsACString& aScheme)
326
0
{
327
0
  aScheme = "moz-icon";
328
0
  return NS_OK;
329
0
}
330
331
nsresult
332
nsMozIconURI::SetScheme(const nsACString& aScheme)
333
0
{
334
0
  // doesn't make sense to set the scheme of a moz-icon URL
335
0
  return NS_ERROR_FAILURE;
336
0
}
337
338
NS_IMETHODIMP
339
nsMozIconURI::GetUsername(nsACString& aUsername)
340
0
{
341
0
  return NS_ERROR_FAILURE;
342
0
}
343
344
nsresult
345
nsMozIconURI::SetUsername(const nsACString& aUsername)
346
0
{
347
0
  return NS_ERROR_FAILURE;
348
0
}
349
350
NS_IMETHODIMP
351
nsMozIconURI::GetPassword(nsACString& aPassword)
352
0
{
353
0
  return NS_ERROR_FAILURE;
354
0
}
355
356
nsresult
357
nsMozIconURI::SetPassword(const nsACString& aPassword)
358
0
{
359
0
  return NS_ERROR_FAILURE;
360
0
}
361
362
NS_IMETHODIMP
363
nsMozIconURI::GetUserPass(nsACString& aUserPass)
364
0
{
365
0
  return NS_ERROR_FAILURE;
366
0
}
367
368
nsresult
369
nsMozIconURI::SetUserPass(const nsACString& aUserPass)
370
0
{
371
0
  return NS_ERROR_FAILURE;
372
0
}
373
374
NS_IMETHODIMP
375
nsMozIconURI::GetHostPort(nsACString& aHostPort)
376
0
{
377
0
  return NS_ERROR_FAILURE;
378
0
}
379
380
nsresult
381
nsMozIconURI::SetHostPort(const nsACString& aHostPort)
382
0
{
383
0
  return NS_ERROR_FAILURE;
384
0
}
385
386
NS_IMETHODIMP
387
nsMozIconURI::GetHost(nsACString& aHost)
388
0
{
389
0
  return NS_ERROR_FAILURE;
390
0
}
391
392
nsresult
393
nsMozIconURI::SetHost(const nsACString& aHost)
394
0
{
395
0
  return NS_ERROR_FAILURE;
396
0
}
397
398
NS_IMETHODIMP
399
nsMozIconURI::GetPort(int32_t* aPort)
400
0
{
401
0
  return NS_ERROR_FAILURE;
402
0
}
403
404
nsresult
405
nsMozIconURI::SetPort(int32_t aPort)
406
0
{
407
0
  return NS_ERROR_FAILURE;
408
0
}
409
410
NS_IMETHODIMP
411
nsMozIconURI::GetPathQueryRef(nsACString& aPath)
412
0
{
413
0
  aPath.Truncate();
414
0
  return NS_OK;
415
0
}
416
417
nsresult
418
nsMozIconURI::SetPathQueryRef(const nsACString& aPath)
419
0
{
420
0
  return NS_ERROR_FAILURE;
421
0
}
422
423
NS_IMETHODIMP
424
nsMozIconURI::GetFilePath(nsACString& aFilePath)
425
0
{
426
0
  aFilePath.Truncate();
427
0
  return NS_OK;
428
0
}
429
430
nsresult
431
nsMozIconURI::SetFilePath(const nsACString& aFilePath)
432
0
{
433
0
  return NS_ERROR_FAILURE;
434
0
}
435
436
NS_IMETHODIMP
437
nsMozIconURI::GetQuery(nsACString& aQuery)
438
0
{
439
0
  aQuery.Truncate();
440
0
  return NS_OK;
441
0
}
442
443
nsresult
444
nsMozIconURI::SetQuery(const nsACString& aQuery)
445
0
{
446
0
  return NS_ERROR_FAILURE;
447
0
}
448
449
nsresult
450
nsMozIconURI::SetQueryWithEncoding(const nsACString& aQuery,
451
                                   const Encoding* aEncoding)
452
0
{
453
0
  return NS_ERROR_FAILURE;
454
0
}
455
456
NS_IMETHODIMP
457
nsMozIconURI::GetRef(nsACString& aRef)
458
0
{
459
0
  aRef.Truncate();
460
0
  return NS_OK;
461
0
}
462
463
nsresult
464
nsMozIconURI::SetRef(const nsACString& aRef)
465
0
{
466
0
  return NS_ERROR_FAILURE;
467
0
}
468
469
NS_IMETHODIMP
470
nsMozIconURI::Equals(nsIURI* other, bool* result)
471
0
{
472
0
  *result = false;
473
0
  NS_ENSURE_ARG_POINTER(other);
474
0
  MOZ_ASSERT(result, "null pointer");
475
0
476
0
  nsAutoCString spec1;
477
0
  nsAutoCString spec2;
478
0
479
0
  nsresult rv = GetSpec(spec1);
480
0
  NS_ENSURE_SUCCESS(rv, rv);
481
0
  rv = other->GetSpec(spec2);
482
0
  NS_ENSURE_SUCCESS(rv, rv);
483
0
484
0
  if (!PL_strcasecmp(spec1.get(), spec2.get())) {
485
0
    *result = true;
486
0
  } else {
487
0
    *result = false;
488
0
  }
489
0
  return NS_OK;
490
0
}
491
492
NS_IMETHODIMP
493
nsMozIconURI::EqualsExceptRef(nsIURI* other, bool* result)
494
0
{
495
0
  // GetRef/SetRef not supported by nsMozIconURI, so
496
0
  // EqualsExceptRef() is the same as Equals().
497
0
  return Equals(other, result);
498
0
}
499
500
NS_IMETHODIMP
501
nsMozIconURI::SchemeIs(const char* aScheme, bool* aEquals)
502
0
{
503
0
  NS_ENSURE_ARG_POINTER(aEquals);
504
0
  if (!aScheme) {
505
0
    return NS_ERROR_INVALID_ARG;
506
0
  }
507
0
508
0
  *aEquals = PL_strcasecmp("moz-icon", aScheme) ? false : true;
509
0
  return NS_OK;
510
0
}
511
512
nsresult
513
nsMozIconURI::Clone(nsIURI** result)
514
0
{
515
0
  nsresult rv;
516
0
  nsCOMPtr<nsIURL> newIconURL;
517
0
  if (mIconURL) {
518
0
    newIconURL = do_QueryInterface(mIconURL, &rv);
519
0
    if (NS_FAILED(rv)) {
520
0
      return rv;
521
0
    }
522
0
  }
523
0
524
0
  RefPtr<nsMozIconURI> uri = new nsMozIconURI();
525
0
  newIconURL.swap(uri->mIconURL);
526
0
  uri->mSize = mSize;
527
0
  uri->mContentType = mContentType;
528
0
  uri->mFileName = mFileName;
529
0
  uri->mStockIcon = mStockIcon;
530
0
  uri->mIconSize = mIconSize;
531
0
  uri->mIconState = mIconState;
532
0
  uri.forget(result);
533
0
534
0
  return NS_OK;
535
0
}
536
537
NS_IMETHODIMP
538
nsMozIconURI::Resolve(const nsACString& relativePath, nsACString& result)
539
0
{
540
0
  return NS_ERROR_NOT_IMPLEMENTED;
541
0
}
542
543
NS_IMETHODIMP
544
nsMozIconURI::GetAsciiSpec(nsACString& aSpecA)
545
0
{
546
0
  return GetSpec(aSpecA);
547
0
}
548
549
NS_IMETHODIMP
550
nsMozIconURI::GetAsciiHostPort(nsACString& aHostPortA)
551
0
{
552
0
  return GetHostPort(aHostPortA);
553
0
}
554
555
NS_IMETHODIMP
556
nsMozIconURI::GetAsciiHost(nsACString& aHostA)
557
0
{
558
0
  return GetHost(aHostA);
559
0
}
560
561
////////////////////////////////////////////////////////////////////////////////
562
// nsIIconUri methods:
563
564
NS_IMETHODIMP
565
nsMozIconURI::GetIconURL(nsIURL** aFileUrl)
566
0
{
567
0
  *aFileUrl = mIconURL;
568
0
  NS_IF_ADDREF(*aFileUrl);
569
0
  return NS_OK;
570
0
}
571
572
NS_IMETHODIMP
573
nsMozIconURI::GetImageSize(uint32_t* aImageSize)
574
              // measured by # of pixels in a row. defaults to 16.
575
0
{
576
0
  *aImageSize = mSize;
577
0
  return NS_OK;
578
0
}
579
580
NS_IMETHODIMP
581
nsMozIconURI::GetContentType(nsACString& aContentType)
582
0
{
583
0
  aContentType = mContentType;
584
0
  return NS_OK;
585
0
}
586
587
NS_IMETHODIMP
588
nsMozIconURI::GetFileExtension(nsACString& aFileExtension)
589
0
{
590
0
  // First, try to get the extension from mIconURL if we have one
591
0
  if (mIconURL) {
592
0
    nsAutoCString fileExt;
593
0
    if (NS_SUCCEEDED(mIconURL->GetFileExtension(fileExt))) {
594
0
      if (!fileExt.IsEmpty()) {
595
0
        // unfortunately, this code doesn't give us the required '.' in
596
0
        // front of the extension so we have to do it ourselves.
597
0
        aFileExtension.Assign('.');
598
0
        aFileExtension.Append(fileExt);
599
0
      }
600
0
    }
601
0
    return NS_OK;
602
0
  }
603
0
604
0
  if (!mFileName.IsEmpty()) {
605
0
    // truncate the extension out of the file path...
606
0
    const char* chFileName = mFileName.get(); // get the underlying buffer
607
0
    const char* fileExt = strrchr(chFileName, '.');
608
0
    if (!fileExt) {
609
0
      return NS_OK;
610
0
    }
611
0
    aFileExtension = fileExt;
612
0
  }
613
0
614
0
  return NS_OK;
615
0
}
616
617
NS_IMETHODIMP
618
nsMozIconURI::GetStockIcon(nsACString& aStockIcon)
619
0
{
620
0
  aStockIcon = mStockIcon;
621
0
  return NS_OK;
622
0
}
623
624
NS_IMETHODIMP
625
nsMozIconURI::GetIconSize(nsACString& aSize)
626
0
{
627
0
  if (mIconSize >= 0) {
628
0
    aSize = kSizeStrings[mIconSize];
629
0
  } else {
630
0
    aSize.Truncate();
631
0
  }
632
0
  return NS_OK;
633
0
}
634
635
NS_IMETHODIMP
636
nsMozIconURI::GetIconState(nsACString& aState)
637
0
{
638
0
  if (mIconState >= 0) {
639
0
    aState = kStateStrings[mIconState];
640
0
  } else {
641
0
    aState.Truncate();
642
0
  }
643
0
  return NS_OK;
644
0
}
645
////////////////////////////////////////////////////////////////////////////////
646
// nsIIPCSerializableURI methods:
647
648
void
649
nsMozIconURI::Serialize(URIParams& aParams)
650
0
{
651
0
  IconURIParams params;
652
0
653
0
  if (mIconURL) {
654
0
    URIParams iconURLParams;
655
0
    SerializeURI(mIconURL, iconURLParams);
656
0
    if (iconURLParams.type() == URIParams::T__None) {
657
0
      // Serialization failed, bail.
658
0
      return;
659
0
    }
660
0
661
0
    params.uri() = iconURLParams;
662
0
  } else {
663
0
    params.uri() = void_t();
664
0
  }
665
0
666
0
  params.size() = mSize;
667
0
  params.fileName() = mFileName;
668
0
  params.stockIcon() = mStockIcon;
669
0
  params.iconSize() = mIconSize;
670
0
  params.iconState() = mIconState;
671
0
672
0
  aParams = params;
673
0
}
674
675
bool
676
nsMozIconURI::Deserialize(const URIParams& aParams)
677
0
{
678
0
  if (aParams.type() != URIParams::TIconURIParams) {
679
0
    MOZ_ASSERT_UNREACHABLE("Received unknown URI from other process!");
680
0
    return false;
681
0
  }
682
0
683
0
  const IconURIParams& params = aParams.get_IconURIParams();
684
0
  if (params.uri().type() != OptionalURIParams::Tvoid_t) {
685
0
    nsCOMPtr<nsIURI> uri = DeserializeURI(params.uri().get_URIParams());
686
0
    mIconURL = do_QueryInterface(uri);
687
0
    if (!mIconURL) {
688
0
      MOZ_ASSERT_UNREACHABLE("bad nsIURI passed");
689
0
      return false;
690
0
    }
691
0
  }
692
0
693
0
  mSize = params.size();
694
0
  mContentType = params.contentType();
695
0
  mFileName = params.fileName();
696
0
  mStockIcon = params.stockIcon();
697
0
698
0
  if (params.iconSize() < -1 ||
699
0
      params.iconSize() >= (int32_t) ArrayLength(kSizeStrings)) {
700
0
    return false;
701
0
  }
702
0
  mIconSize = params.iconSize();
703
0
704
0
  if (params.iconState() < -1 ||
705
0
      params.iconState() >= (int32_t) ArrayLength(kStateStrings)) {
706
0
    return false;
707
0
  }
708
0
  mIconState = params.iconState();
709
0
710
0
  return true;
711
0
}
712
713
NS_IMETHODIMP
714
nsMozIconURI::GetInnerURI(nsIURI** aURI)
715
0
{
716
0
  nsCOMPtr<nsIURI> iconURL = do_QueryInterface(mIconURL);
717
0
  if (!iconURL) {
718
0
    *aURI = nullptr;
719
0
    return NS_ERROR_FAILURE;
720
0
  }
721
0
722
0
  iconURL.forget(aURI);
723
0
  return NS_OK;
724
0
}
725
726
NS_IMETHODIMP
727
nsMozIconURI::GetInnermostURI(nsIURI** aURI)
728
0
{
729
0
  return NS_ImplGetInnermostURI(this, aURI);
730
0
}