15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
27757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
37757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
47757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch * Copyright (C) 2013 Samsung Electronics. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/DOMWindowBase64.h"
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
37df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "core/dom/ExceptionCode.h"
3851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/html/parser/HTMLParserIdioms.h"
397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/text/Base64.h"
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochString DOMWindowBase64::btoa(const String& stringToEncode, ExceptionState& exceptionState)
447757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{
457757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (stringToEncode.isNull())
467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return String();
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (!stringToEncode.containsOnlyLatin1()) {
49a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidCharacterError, "The string to be encoded contains characters outside of the Latin1 range.");
507757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return String();
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    return base64Encode(stringToEncode.latin1());
547757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch}
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochString DOMWindowBase64::atob(const String& encodedString, ExceptionState& exceptionState)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
587757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (encodedString.isNull())
597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return String();
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (!encodedString.containsOnlyLatin1()) {
62a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidCharacterError, "The string to be decoded contains characters outside of the Latin1 range.");
637757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return String();
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
657757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    Vector<char> out;
6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!base64Decode(encodedString, out, isHTMLSpace<UChar>, Base64ValidatePadding)) {
67a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidCharacterError, "The string to be decoded is not correctly encoded.");
687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return String();
697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
717757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    return String(out.data(), out.size());
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
75