Changeset 159992 in webkit


Ignore:
Timestamp:
Dec 2, 2013 9:53:32 PM (10 years ago)
Author:
commit-queue@webkit.org
Message:

Add ability to iterate over API::Array
https://bugs.webkit.org/show_bug.cgi?id=124533

Patch by Martin Hock <mhock@apple.com> on 2013-12-02
Reviewed by Sam Weinig.

  • GNUmakefile.list.am:
  • Shared/APIArray.h:
  • Shared/FilterIterator.h:
  • Shared/IteratorPair.h:
  • WebKit2.xcodeproj/project.pbxproj:
  • WebProcess/InjectedBundle/InjectedBundle.cpp:

(WebKit::toStringVector):

  • WebProcess/InjectedBundle/InjectedBundlePageEditorClient.cpp:

(WebKit::InjectedBundlePageEditorClient::getPasteboardDataForRange):

Location:
trunk/Source/WebKit2
Files:
6 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r159991 r159992  
     12013-12-02  Martin Hock  <mhock@apple.com>
     2
     3        Add ability to iterate over API::Array
     4        https://bugs.webkit.org/show_bug.cgi?id=124533
     5
     6        Reviewed by Sam Weinig.
     7
     8        * GNUmakefile.list.am:
     9        * Shared/APIArray.h:
     10        * Shared/FilterIterator.h:
     11        * Shared/IteratorPair.h:
     12        * WebKit2.xcodeproj/project.pbxproj:
     13        * WebProcess/InjectedBundle/InjectedBundle.cpp:
     14        (WebKit::toStringVector):
     15        * WebProcess/InjectedBundle/InjectedBundlePageEditorClient.cpp:
     16        (WebKit::InjectedBundlePageEditorClient::getPasteboardDataForRange):
     17
    1182013-12-02  Dan Bernstein  <mitz@apple.com>
    219
  • trunk/Source/WebKit2/GNUmakefile.list.am

    r159647 r159992  
    423423        Source/WebKit2/Shared/EditorState.cpp \
    424424        Source/WebKit2/Shared/EditorState.h \
     425        Source/WebKit2/Shared/FilterIterator.h \
    425426        Source/WebKit2/Shared/FontSmoothingLevel.h \
    426427        Source/WebKit2/Shared/ProcessExecutablePath.h \
     
    439440        Source/WebKit2/Shared/ImmutableDictionary.cpp \
    440441        Source/WebKit2/Shared/ImmutableDictionary.h \
     442        Source/WebKit2/Shared/IteratorPair.h \
    441443        Source/WebKit2/Shared/LayerTreeContext.h \
    442444        Source/WebKit2/Shared/MutableDictionary.cpp \
  • trunk/Source/WebKit2/Shared/APIArray.h

    r159236 r159992  
    11/*
    2  * Copyright (C) 2010 Apple Inc. All rights reserved.
     2 * Copyright (C) 2010, 2013 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2828
    2929#include "APIObject.h"
     30#include "FilterIterator.h"
     31#include "IteratorPair.h"
    3032#include <wtf/Forward.h>
    3133#include <wtf/PassRefPtr.h>
     
    3537
    3638class Array FINAL : public TypedObject<Object::Type::Array> {
     39private:
     40    template<typename T>
     41    static inline const T* getObject(const RefPtr<Object>& object) { return static_cast<const T*>(object.get()); }
     42
     43    template<typename T>
     44    static inline bool isType(const RefPtr<Object>& object) { return object->type() == T::APIType; }
     45
    3746public:
    3847    static PassRefPtr<Array> create();
     
    4655    T* at(size_t i) const
    4756    {
    48         if (m_elements[i]->type() != T::APIType)
     57        if (!isType<T>(m_elements[i]))
    4958            return nullptr;
    5059
     
    5867    Vector<RefPtr<Object>>& elements() { return m_elements; }
    5968
     69    template<typename T>
     70    IteratorPair<FilterIterator<decltype(&isType<T>), decltype(&getObject<T>), Vector<RefPtr<Object>>::const_iterator>> elementsOfType()
     71    {
     72        return IteratorPair<FilterIterator<decltype(&isType<T>), decltype(&getObject<T>), Vector<RefPtr<Object>>::const_iterator>>(FilterIterator<decltype(&isType<T>), decltype(&getObject<T>), Vector<RefPtr<Object>>::const_iterator>(isType<T>, getObject<T>, m_elements.begin(), m_elements.end()), FilterIterator<decltype(&isType<T>), decltype(&getObject<T>), Vector<RefPtr<Object>>::const_iterator>(isType<T>, getObject<T>, m_elements.end(), m_elements.end()));
     73    }
     74
    6075private:
    6176    explicit Array(Vector<RefPtr<Object>> elements);
  • trunk/Source/WebKit2/Shared/FilterIterator.h

    r159991 r159992  
    11/*
    2  * Copyright (C) 2010 Apple Inc. All rights reserved.
     2 * Copyright (C) 2013 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #ifndef APIArray_h
    27 #define APIArray_h
     26#ifndef FilterIterator_h
     27#define FilterIterator_h
    2828
    2929#include "APIObject.h"
     
    3434namespace API {
    3535
    36 class Array FINAL : public TypedObject<Object::Type::Array> {
     36template<typename Predicate, typename Cast, typename Iterator>
     37class FilterIterator {
    3738public:
    38     static PassRefPtr<Array> create();
    39     static PassRefPtr<Array> create(Vector<RefPtr<Object>> elements);
    40 
    41     static PassRefPtr<Array> createStringArray(const Vector<String>&);
    42 
    43     virtual ~Array();
    44 
    45     template<typename T>
    46     T* at(size_t i) const
     39    FilterIterator(Predicate pred, Cast cast, Iterator begin, Iterator end)
     40        : m_pred(std::move(pred))
     41        , m_cast(std::move(cast))
     42        , m_iter(std::move(begin))
     43        , m_end(std::move(end))
    4744    {
    48         if (m_elements[i]->type() != T::APIType)
    49             return nullptr;
    50 
    51         return static_cast<T*>(m_elements[i].get());
     45        while (m_iter != m_end && !m_pred(*m_iter))
     46            ++m_iter;
    5247    }
    5348
    54     Object* at(size_t i) const { return m_elements[i].get(); }
    55     size_t size() const { return m_elements.size(); }
     49    FilterIterator& operator++()
     50    {
     51        while (m_iter != m_end) {
     52            ++m_iter;
     53            if (m_iter == m_end || m_pred(*m_iter))
     54                break;
     55        }
     56        return *this;
     57    }
    5658
    57     const Vector<RefPtr<Object>>& elements() const { return m_elements; }
    58     Vector<RefPtr<Object>>& elements() { return m_elements; }
     59    const decltype(std::declval<Cast>()(*std::declval<Iterator>())) operator*() const
     60    {
     61        ASSERT(m_iter != m_end);
     62        ASSERT(m_pred(*m_iter));
     63        return m_cast(*m_iter);
     64    }
     65
     66    inline bool operator==(FilterIterator& other) const { return m_iter == other.m_iter; }
     67    inline bool operator!=(FilterIterator& other) const { return m_iter != other.m_iter; }
    5968
    6069private:
    61     explicit Array(Vector<RefPtr<Object>> elements);
    62 
    63     Vector<RefPtr<Object>> m_elements;
     70    const Predicate m_pred;
     71    const Cast m_cast;
     72    Iterator m_iter;
     73    Iterator m_end;
    6474};
    6575
    6676} // namespace API
    6777
    68 #endif // APIArray_h
     78#endif // FilterIterator_h
  • trunk/Source/WebKit2/Shared/IteratorPair.h

    r159991 r159992  
    11/*
    2  * Copyright (C) 2010 Apple Inc. All rights reserved.
     2 * Copyright (C) 2013 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #ifndef APIArray_h
    27 #define APIArray_h
    28 
    29 #include "APIObject.h"
    30 #include <wtf/Forward.h>
    31 #include <wtf/PassRefPtr.h>
    32 #include <wtf/Vector.h>
    33 
    34 namespace API {
    35 
    36 class Array FINAL : public TypedObject<Object::Type::Array> {
     26template<typename Iterator> class IteratorPair {
    3727public:
    38     static PassRefPtr<Array> create();
    39     static PassRefPtr<Array> create(Vector<RefPtr<Object>> elements);
    40 
    41     static PassRefPtr<Array> createStringArray(const Vector<String>&);
    42 
    43     virtual ~Array();
    44 
    45     template<typename T>
    46     T* at(size_t i) const
     28    IteratorPair(Iterator begin, Iterator end)
     29        : m_begin(std::move(begin))
     30        , m_end(std::move(end))
    4731    {
    48         if (m_elements[i]->type() != T::APIType)
    49             return nullptr;
    50 
    51         return static_cast<T*>(m_elements[i].get());
    5232    }
    5333
    54     Object* at(size_t i) const { return m_elements[i].get(); }
    55     size_t size() const { return m_elements.size(); }
    56 
    57     const Vector<RefPtr<Object>>& elements() const { return m_elements; }
    58     Vector<RefPtr<Object>>& elements() { return m_elements; }
     34    Iterator begin() { return m_begin; }
     35    Iterator end() { return m_end; }
    5936
    6037private:
    61     explicit Array(Vector<RefPtr<Object>> elements);
    62 
    63     Vector<RefPtr<Object>> m_elements;
     38    Iterator m_begin, m_end;
    6439};
    65 
    66 } // namespace API
    67 
    68 #endif // APIArray_h
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r159991 r159992  
    685685                728E86F11795188C0087879E /* WebColorPickerMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 728E86EF1795188C0087879E /* WebColorPickerMac.h */; };
    686686                728E86F21795188C0087879E /* WebColorPickerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 728E86F01795188C0087879E /* WebColorPickerMac.mm */; };
     687                752A8077183D6DA7003D659E /* FilterIterator.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 752A8076183D6DA7003D659E /* FilterIterator.h */; };
    687688                755422BB18062B9C0046F6A8 /* WKOriginDataManager.cpp in Copy Files */ = {isa = PBXBuildFile; fileRef = 755422B918062B9C0046F6A8 /* WKOriginDataManager.cpp */; };
    688689                755422BC18062B9C0046F6A8 /* WKOriginDataManager.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 755422BA18062B9C0046F6A8 /* WKOriginDataManager.h */; };
     
    692693                755422CB180650020046F6A8 /* WebOriginDataManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 755422C618064FFC0046F6A8 /* WebOriginDataManager.cpp */; };
    693694                755422CC180773CE0046F6A8 /* WebOriginDataManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 755422C718064FFC0046F6A8 /* WebOriginDataManager.h */; };
     695                757AF978184D131400E6316E /* IteratorPair.h in Headers */ = {isa = PBXBuildFile; fileRef = 757AF976184D130500E6316E /* IteratorPair.h */; };
    694696                759CCD581808F1640078E8A8 /* WebOriginDataManagerProxyChangeClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 759CCD541808F1600078E8A8 /* WebOriginDataManagerProxyChangeClient.cpp */; };
    695697                759CCD591808F1690078E8A8 /* WebOriginDataManagerProxyChangeClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 759CCD551808F1600078E8A8 /* WebOriginDataManagerProxyChangeClient.h */; };
     
    14681470                                755422C318062BE40046F6A8 /* WebOriginDataManagerProxy.messages.in in Copy Files */,
    14691471                                1A50DB66110A3D57000D3FE5 /* WebProcess.app in Copy Files */,
     1472                                752A8077183D6DA7003D659E /* FilterIterator.h in Copy Files */,
    14701473                                755422BB18062B9C0046F6A8 /* WKOriginDataManager.cpp in Copy Files */,
    14711474                        );
     
    22532256                728E86EF1795188C0087879E /* WebColorPickerMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebColorPickerMac.h; sourceTree = "<group>"; };
    22542257                728E86F01795188C0087879E /* WebColorPickerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebColorPickerMac.mm; sourceTree = "<group>"; };
     2258                752A8076183D6DA7003D659E /* FilterIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FilterIterator.h; sourceTree = "<group>"; };
    22552259                755422B918062B9C0046F6A8 /* WKOriginDataManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKOriginDataManager.cpp; sourceTree = "<group>"; };
    22562260                755422BA18062B9C0046F6A8 /* WKOriginDataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKOriginDataManager.h; sourceTree = "<group>"; };
     
    22612265                755422C718064FFC0046F6A8 /* WebOriginDataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebOriginDataManager.h; path = OriginData/WebOriginDataManager.h; sourceTree = "<group>"; };
    22622266                755422C818064FFC0046F6A8 /* WebOriginDataManager.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebOriginDataManager.messages.in; path = OriginData/WebOriginDataManager.messages.in; sourceTree = "<group>"; };
     2267                757AF976184D130500E6316E /* IteratorPair.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IteratorPair.h; sourceTree = "<group>"; };
    22632268                759CCD541808F1600078E8A8 /* WebOriginDataManagerProxyChangeClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebOriginDataManagerProxyChangeClient.cpp; sourceTree = "<group>"; };
    22642269                759CCD551808F1600078E8A8 /* WebOriginDataManagerProxyChangeClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebOriginDataManagerProxyChangeClient.h; sourceTree = "<group>"; };
     
    34263431                                8CFECE931490F140002AAA32 /* EditorState.cpp */,
    34273432                                1AA41AB412C02EC4002BE67B /* EditorState.h */,
     3433                                752A8076183D6DA7003D659E /* FilterIterator.h */,
    34283434                                BCE81D8A1319F7EF00241910 /* FontInfo.cpp */,
    34293435                                BCE81D8B1319F7EF00241910 /* FontInfo.h */,
     
    34333439                                BCBCB0CC1215E33A00DE59CA /* ImmutableDictionary.cpp */,
    34343440                                BCBCB0CA1215E32100DE59CA /* ImmutableDictionary.h */,
     3441                                757AF976184D130500E6316E /* IteratorPair.h */,
    34353442                                1A92DC1012F8BA460017AF65 /* LayerTreeContext.h */,
    34363443                                BCB0AEE8122F53E300B1341E /* MutableDictionary.cpp */,
     
    57975804                                E179088F169BAA6A006904C7 /* SecItemShim.h in Headers */,
    57985805                                511F8A7B138B460900A95F44 /* SecItemShimLibrary.h in Headers */,
     5806                                757AF978184D131400E6316E /* IteratorPair.h in Headers */,
    57995807                                E1790891169BAA82006904C7 /* SecItemShimMessages.h in Headers */,
    58005808                                E18E690C169B563F009B6670 /* SecItemShimProxy.h in Headers */,
  • trunk/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp

    r159988 r159992  
    486486
    487487    patternsVector.reserveInitialCapacity(size);
    488     for (size_t i = 0; i < size; ++i) {
    489         WebString* entry = patterns->at<WebString>(i);
    490         if (entry)
    491             patternsVector.uncheckedAppend(entry->string());
    492     }
     488    for (const auto& entry : patterns->elementsOfType<WebString>())
     489        patternsVector.uncheckedAppend(entry->string());
    493490    return patternsVector;
    494491}
  • trunk/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundlePageEditorClient.cpp

    r159988 r159992  
    155155        ASSERT(typesArray->size() == dataArray->size());
    156156
    157         size_t size = typesArray->size();
    158         for (size_t i = 0; i < size; ++i) {
    159             WebString* type = typesArray->at<WebString>(i);
    160             if (type)
    161                 pasteboardTypes.append(type->string());
    162         }
     157        for (const auto& type : typesArray->elementsOfType<WebString>())
     158            pasteboardTypes.append(type->string());
    163159
    164         size = dataArray->size();
    165         for (size_t i = 0; i < size; ++i) {
    166             WebData* item = dataArray->at<WebData>(i);
    167             if (item) {
    168                 RefPtr<SharedBuffer> buffer = SharedBuffer::create(item->bytes(), item->size());
    169                 pasteboardData.append(buffer);
    170             }
     160        for (const auto& item : dataArray->elementsOfType<WebData>()) {
     161            RefPtr<SharedBuffer> buffer = SharedBuffer::create(item->bytes(), item->size());
     162            pasteboardData.append(buffer);
    171163        }
    172164    }
Note: See TracChangeset for help on using the changeset viewer.