summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/loader/resource/document_resource.cc
blob: b1d14480dcfa8747319af2f39c30d8834100a119 (plain)
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
/*
    Copyright (C) 2010 Rob Buis <rwlbuis@gmail.com>
    Copyright (C) 2011 Cosmin Truta <ctruta@gmail.com>
    Copyright (C) 2012 University of Szeged
    Copyright (C) 2012 Renata Hodovan <reni@webkit.org>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

#include "third_party/blink/renderer/core/loader/resource/document_resource.h"

#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
#include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h"
#include "third_party/blink/renderer/core/dom/document_init.h"
#include "third_party/blink/renderer/core/dom/xml_document.h"
#include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
#include "third_party/blink/renderer/platform/loader/fetch/text_resource_decoder_options.h"
#include "third_party/blink/renderer/platform/wtf/shared_buffer.h"
#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"

namespace blink {

DocumentResource* DocumentResource::FetchSVGDocument(FetchParameters& params,
                                                     ResourceFetcher* fetcher,
                                                     ResourceClient* client) {
  DCHECK_EQ(params.GetResourceRequest().GetMode(),
            network::mojom::RequestMode::kSameOrigin);
  params.SetRequestContext(mojom::RequestContextType::IMAGE);
  return ToDocumentResource(
      fetcher->RequestResource(params, SVGDocumentResourceFactory(), client));
}

DocumentResource::DocumentResource(
    const ResourceRequest& request,
    ResourceType type,
    const ResourceLoaderOptions& options,
    const TextResourceDecoderOptions& decoder_options)
    : TextResource(request, type, options, decoder_options) {
  // FIXME: We'll support more types to support HTMLImports.
  DCHECK_EQ(type, ResourceType::kSVGDocument);
}

DocumentResource::~DocumentResource() = default;

void DocumentResource::Trace(blink::Visitor* visitor) {
  visitor->Trace(document_);
  Resource::Trace(visitor);
}

void DocumentResource::NotifyFinished() {
  if (Data() && MimeTypeAllowed()) {
    // We don't need to create a new frame because the new document belongs to
    // the parent UseElement.
    document_ = CreateDocument(GetResponse().CurrentRequestUrl());
    document_->SetContent(DecodedText());
  }
  Resource::NotifyFinished();
}

bool DocumentResource::MimeTypeAllowed() const {
  DCHECK_EQ(GetType(), ResourceType::kSVGDocument);
  AtomicString mime_type = GetResponse().MimeType();
  if (GetResponse().IsHTTP())
    mime_type = HttpContentType();
  return mime_type == "image/svg+xml" || mime_type == "text/xml" ||
         mime_type == "application/xml" || mime_type == "application/xhtml+xml";
}

Document* DocumentResource::CreateDocument(const KURL& url) {
  switch (GetType()) {
    case ResourceType::kSVGDocument:
      return XMLDocument::CreateSVG(DocumentInit::Create().WithURL(url));
    default:
      // FIXME: We'll add more types to support HTMLImports.
      NOTREACHED();
      return nullptr;
  }
}

}  // namespace blink