Hi folks.
I have some work planned on the DOM clipboard classes. I’m not in a big hurry
to get this done fast. It’s my side project. But I thought some people might be
interested in what I am thinking about doing. I have a good 20% of the project
already sitting in my local git repository and I’m going to file a bug or two
and start posting patches soon.
The major step is to refactor so that Pasteboard is the platform abstraction
and Clipboard is a pure DOM class built on top of Pasteboard. To do a good job
on that I will probably need help from people willing to tackle platforms other
than Mac. I’ve started by doing the refactoring on Mac and putting an #ifdef in
place for scaffolding.
Here are my notes so far on what I think I’d like to do, in case you’d like to
comment.
DOM Clipboard class and platform directory clipboard and drag abstraction class
(Pasteboard)
Get Clipboard.h and DragState.h includes out of commonly-included headers.
- Doing this first makes the changes to Clipboard.h require a lot less
recompiling.
Change DragClient so it uses a Pasteboard object instead of a Clipboard object
to pass the identifier of the pasteboard.
Make Clipboard a non-polymorphic class with the abstractions in the Pasteboard
class.
- Each Clipboard will hold a Pasteboard.
- Mac first, then each other platform.
- Share as much code as possible between platforms in Clipboard; platform
differences should be primarily in Pasteboard.
- This will add more functions to the Pasteboard class.
Make Pasteboard functions const, since Pasteboard identifies a pasteboard--the
actual pasteboard contents are "outside the class".
Pass pasteboards around as const Pasteboard&.
For operations that are not part of the Clipboard DOM API, have callers get to
the Pasteboard and use it, rather than using the Clipboard.
Move all Clipboard class code into the DOM directory.
- Even platform-specific functions should be there, not in the platform
directory.
Factor out the non-platform-abstraction parts of Pasteboard that depend on the
DOM, Page, Frame, etc. and move that part into the editing directory
Move the Mac-specific snapshotting functions out of Frame.h and FrameMac.mm
into their own home.
- Probably the editing directory.
- Change interfaces to be platform independent so the callers don't need to use
Objective-C++.
- Consider making them cross-platform.
Investigate replacing DragImageRef with a more solid abstraction rather than a
typedef.
- Need to be able to write platform-independent drag code.
Change Clipboard functions to match DOM instead of having subtly different
names.
Eliminate custom bindings for Clipboard.
- Move setDragImage element logic out of JSClipboardCustom.cpp bindings into
the Clipboard class.
- Change return type of Clipboard::types to PassRefPtr<DOMStringList> instead
of ListHashSet<String> because that's what we support for DOMString[] in our
IDL. Or alternatively, do more overloads for toArray so we can use
Vector<String> or ListHashSet<String>.
Make sure Pasteboard checks this is still the current pasteboard when doing
write operations with change count on Mac.
- Is there an equivalent on other platforms?
- Creating a new pasteboard gets the change count each time, which may be
excessive; is there a better way to fit this in?
Put more of the dragging code inside #if ENABLE(DRAG_SUPPORT).
- It seems kind of random what is conditional and what is not.
Do something to more clearly separate the dragging and copy/paste code the
Pasteboard class.
Reduce some of the strange idioms in the Clipboard class
- The use of the magic string "initialized" for dropEffect and effectAllowed is
strange.
Rename Clipboard to DOMClipboard.
Rename Pasteboard to Clipboard.
Rename DragState members to eliminate the m_ prefix since it's a struct. Or
make it a class.
Rename DragState::m_dragSrc to dragSource, or perhaps something even nicer.
DOM Event classes
Break headers back up into a file per class?
- MouseEvent.h has many classes in it.
Cut down on DOM event class constructors and "create" functions.
- Should need only one constructor per class, the one that takes the
initializer, or possibly the empty one.
- Code inside WebCore and WebKit should use one of the two create functions
used by the bindings.
- Need to put all the arguments into the initializers, but the way they work we
can't put RefPtr<Clipboard> into an initializer without including
"Clipboard.h"; might mean we should move initializers into separate headers.
EventInit structures called "initializers" may need some naming work.
- Better to have a name without the abbreviation "init".
- Not sure we should call them "initializers" since they are just
initialization arguments; the name implies they do more than they do.
Reduce or eliminate POINTER_LOCK conditionals in MouseEvent.h.
- First, not sure it makes sense to have more state in the DOM mouse event for
that feature.
- Second, if we do it's excessive to do it with ifdefs in the arguments for
constructors.
- Above refactoring of initializers could be a big help here.
-- Darin
_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev