OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 26 matching lines...) Expand all Loading... |
37 #include "platform/weborigin/SecurityOrigin.h" | 37 #include "platform/weborigin/SecurityOrigin.h" |
38 | 38 |
39 namespace WebCore { | 39 namespace WebCore { |
40 | 40 |
41 static inline bool canReferToParentFrameEncoding(const Frame* frame, const Frame
* parentFrame) | 41 static inline bool canReferToParentFrameEncoding(const Frame* frame, const Frame
* parentFrame) |
42 { | 42 { |
43 return parentFrame && parentFrame->document()->securityOrigin()->canAccess(f
rame->document()->securityOrigin()); | 43 return parentFrame && parentFrame->document()->securityOrigin()->canAccess(f
rame->document()->securityOrigin()); |
44 } | 44 } |
45 | 45 |
46 | 46 |
47 TextResourceDecoderBuilder::TextResourceDecoderBuilder(const String& mimeType, c
onst String& encoding, bool encodingUserChoosen) | 47 TextResourceDecoderBuilder::TextResourceDecoderBuilder(const AtomicString& mimeT
ype, const AtomicString& encoding, bool encodingUserChoosen) |
48 : m_mimeType(mimeType) | 48 : m_mimeType(mimeType) |
49 , m_encoding(encoding) | 49 , m_encoding(encoding) |
50 , m_encodingWasChosenByUser(encodingUserChoosen) | 50 , m_encodingWasChosenByUser(encodingUserChoosen) |
51 { | 51 { |
52 } | 52 } |
53 | 53 |
54 TextResourceDecoderBuilder::~TextResourceDecoderBuilder() | 54 TextResourceDecoderBuilder::~TextResourceDecoderBuilder() |
55 { | 55 { |
56 } | 56 } |
57 | 57 |
58 | 58 |
59 inline PassOwnPtr<TextResourceDecoder> TextResourceDecoderBuilder::createDecoder
Instance(Document* document) | 59 inline PassOwnPtr<TextResourceDecoder> TextResourceDecoderBuilder::createDecoder
Instance(Document* document) |
60 { | 60 { |
61 if (Frame* frame = document->frame()) { | 61 if (Frame* frame = document->frame()) { |
62 if (Settings* settings = frame->settings()) | 62 if (Settings* settings = frame->settings()) |
63 return TextResourceDecoder::create(m_mimeType, settings->defaultText
EncodingName(), settings->usesEncodingDetector()); | 63 return TextResourceDecoder::create(m_mimeType, settings->defaultText
EncodingName(), settings->usesEncodingDetector()); |
64 } | 64 } |
65 | 65 |
66 return TextResourceDecoder::create(m_mimeType, String()); | 66 return TextResourceDecoder::create(m_mimeType, String()); |
67 } | 67 } |
68 | 68 |
69 inline void TextResourceDecoderBuilder::setupEncoding(TextResourceDecoder* decod
er, Document* document) | 69 inline void TextResourceDecoderBuilder::setupEncoding(TextResourceDecoder* decod
er, Document* document) |
70 { | 70 { |
71 Frame* frame = document->frame(); | 71 Frame* frame = document->frame(); |
72 Frame* parentFrame = frame ? frame->tree().parent() : 0; | 72 Frame* parentFrame = frame ? frame->tree().parent() : 0; |
73 | 73 |
74 if (!m_encoding.isEmpty()) | 74 if (!m_encoding.isEmpty()) |
75 decoder->setEncoding(m_encoding, m_encodingWasChosenByUser ? TextResourc
eDecoder::UserChosenEncoding : TextResourceDecoder::EncodingFromHTTPHeader); | 75 decoder->setEncoding(m_encoding.string(), m_encodingWasChosenByUser ? Te
xtResourceDecoder::UserChosenEncoding : TextResourceDecoder::EncodingFromHTTPHea
der); |
76 | 76 |
77 // Set the hint encoding to the parent frame encoding only if | 77 // Set the hint encoding to the parent frame encoding only if |
78 // the parent and the current frames share the security origin. | 78 // the parent and the current frames share the security origin. |
79 // We impose this condition because somebody can make a child frameg63 | 79 // We impose this condition because somebody can make a child frameg63 |
80 // containing a carefully crafted html/javascript in one encoding | 80 // containing a carefully crafted html/javascript in one encoding |
81 // that can be mistaken for hintEncoding (or related encoding) by | 81 // that can be mistaken for hintEncoding (or related encoding) by |
82 // an auto detector. When interpreted in the latter, it could be | 82 // an auto detector. When interpreted in the latter, it could be |
83 // an attack vector. | 83 // an attack vector. |
84 // FIXME: This might be too cautious for non-7bit-encodings and | 84 // FIXME: This might be too cautious for non-7bit-encodings and |
85 // we may consider relaxing this later after testing. | 85 // we may consider relaxing this later after testing. |
86 if (frame && canReferToParentFrameEncoding(frame, parentFrame)) { | 86 if (frame && canReferToParentFrameEncoding(frame, parentFrame)) { |
87 if (parentFrame->document()->encodingWasDetectedHeuristically()) | 87 if (parentFrame->document()->encodingWasDetectedHeuristically()) |
88 decoder->setHintEncoding(parentFrame->document()->encoding()); | 88 decoder->setHintEncoding(parentFrame->document()->encoding()); |
89 | 89 |
90 if (m_encoding.isEmpty()) | 90 if (m_encoding.isEmpty()) |
91 decoder->setEncoding(parentFrame->document()->inputEncoding(), TextR
esourceDecoder::EncodingFromParentFrame); | 91 decoder->setEncoding(parentFrame->document()->inputEncoding(), TextR
esourceDecoder::EncodingFromParentFrame); |
92 } | 92 } |
93 } | 93 } |
94 | 94 |
95 PassOwnPtr<TextResourceDecoder> TextResourceDecoderBuilder::buildFor(Document* d
ocument) | 95 PassOwnPtr<TextResourceDecoder> TextResourceDecoderBuilder::buildFor(Document* d
ocument) |
96 { | 96 { |
97 OwnPtr<TextResourceDecoder> decoder = createDecoderInstance(document); | 97 OwnPtr<TextResourceDecoder> decoder = createDecoderInstance(document); |
98 setupEncoding(decoder.get(), document); | 98 setupEncoding(decoder.get(), document); |
99 return decoder.release(); | 99 return decoder.release(); |
100 } | 100 } |
101 | 101 |
102 void TextResourceDecoderBuilder::clear() | 102 void TextResourceDecoderBuilder::clear() |
103 { | 103 { |
104 if (!m_encodingWasChosenByUser) | 104 if (!m_encodingWasChosenByUser) |
105 m_encoding = String(); | 105 m_encoding = nullAtom; |
106 } | 106 } |
107 | 107 |
108 } | 108 } |
OLD | NEW |