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