Commit 4fd60ed7 authored by shinyak@chromium.org's avatar shinyak@chromium.org

[Refactoring] Move Selection from DOMWindow to TreeScope.

https://bugs.webkit.org/show_bug.cgi?id=82699

Reviewed by Ryosuke Niwa.

Since ShadowRoot will also manage its own version of DOMSelection, we would like to
share the code among Document and DOMSelection. This patch moves DOMSelection from DOMWindow to TreeScope
so that ShadowRoot can also use it.

No new tests, should covered by existing tests.

* dom/Document.cpp:
(WebCore::Document::updateFocusAppearanceTimerFired):
* dom/Document.h:
(Document):
* dom/ShadowRoot.cpp:
(WebCore::ShadowRoot::selection):
* dom/TreeScope.cpp:
(WebCore::TreeScope::~TreeScope):
(WebCore::TreeScope::getSelection):
(WebCore):
* dom/TreeScope.h:
(WebCore):
(TreeScope):
* page/DOMSelection.cpp:
(WebCore::DOMSelection::DOMSelection):
(WebCore::DOMSelection::clearTreeScope):
(WebCore):
* page/DOMSelection.h:
(WebCore):
(WebCore::DOMSelection::create):
(DOMSelection):
* page/DOMWindow.cpp:
(WebCore::DOMWindow::~DOMWindow):
(WebCore::DOMWindow::clearDOMWindowProperties):
(WebCore::DOMWindow::getSelection):
* page/DOMWindow.h:
(DOMWindow):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@116746 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent f5f9f667
2012-05-11 Shinya Kawanaka <shinyak@chromium.org>
[Refactoring] Move Selection from DOMWindow to TreeScope.
https://bugs.webkit.org/show_bug.cgi?id=82699
Reviewed by Ryosuke Niwa.
Since ShadowRoot will also manage its own version of DOMSelection, we would like to
share the code among Document and DOMSelection. This patch moves DOMSelection from DOMWindow to TreeScope
so that ShadowRoot can also use it.
No new tests, should covered by existing tests.
* dom/Document.cpp:
(WebCore::Document::updateFocusAppearanceTimerFired):
* dom/Document.h:
(Document):
* dom/ShadowRoot.cpp:
(WebCore::ShadowRoot::selection):
* dom/TreeScope.cpp:
(WebCore::TreeScope::~TreeScope):
(WebCore::TreeScope::getSelection):
(WebCore):
* dom/TreeScope.h:
(WebCore):
(TreeScope):
* page/DOMSelection.cpp:
(WebCore::DOMSelection::DOMSelection):
(WebCore::DOMSelection::clearTreeScope):
(WebCore):
* page/DOMSelection.h:
(WebCore):
(WebCore::DOMSelection::create):
(DOMSelection):
* page/DOMWindow.cpp:
(WebCore::DOMWindow::~DOMWindow):
(WebCore::DOMWindow::clearDOMWindowProperties):
(WebCore::DOMWindow::getSelection):
* page/DOMWindow.h:
(DOMWindow):
2012-05-04 Yury Semikhatsky <yurys@chromium.org>
Web Inspector: console should allow JS execution in the context of an isolated world
......@@ -46,6 +46,7 @@
#include "ContentSecurityPolicy.h"
#include "CookieJar.h"
#include "DOMImplementation.h"
#include "DOMSelection.h"
#include "DOMWindow.h"
#include "DateComponents.h"
#include "DeviceMotionController.h"
......@@ -5092,12 +5093,6 @@ void Document::updateFocusAppearanceTimerFired(Timer<Document>*)
element->updateFocusAppearance(m_updateFocusAppearanceRestoresSelection);
}
// FF method for accessing the selection added for compatibility.
DOMSelection* Document::getSelection() const
{
return frame() ? frame()->domWindow()->getSelection() : 0;
}
void Document::attachRange(Range* range)
{
ASSERT(!m_ranges.contains(range));
......
......@@ -969,9 +969,6 @@ public:
void updateFocusAppearanceSoon(bool restorePreviousSelection);
void cancelFocusAppearanceUpdate();
// FF method for accessing the selection added for compatibility.
DOMSelection* getSelection() const;
// Extension for manipulating canvas drawing contexts for use in CSS
CanvasRenderingContext* getCSSCanvasContext(const String& type, const String& name, int width, int height);
HTMLCanvasElement* getCSSCanvasElement(const String& name);
......
......@@ -151,8 +151,8 @@ void ShadowRoot::setInnerHTML(const String& markup, ExceptionCode& ec)
DOMSelection* ShadowRoot::selection()
{
if (document() && document()->domWindow())
return document()->domWindow()->getSelection();
if (document())
return document()->getSelection();
return 0;
}
......
......@@ -27,6 +27,8 @@
#include "TreeScope.h"
#include "ContainerNode.h"
#include "DOMSelection.h"
#include "DOMWindow.h"
#include "Document.h"
#include "Element.h"
#include "FocusController.h"
......@@ -36,6 +38,7 @@
#include "HTMLMapElement.h"
#include "HTMLNames.h"
#include "Page.h"
#include "RuntimeEnabledFeatures.h"
#include "TreeScopeAdopter.h"
#include <wtf/text/AtomicString.h>
#include <wtf/text/CString.h>
......@@ -54,6 +57,10 @@ TreeScope::TreeScope(ContainerNode* rootNode)
TreeScope::~TreeScope()
{
if (m_selection) {
m_selection->clearTreeScope();
m_selection = 0;
}
}
void TreeScope::destroyTreeScopeData()
......@@ -116,6 +123,18 @@ HTMLMapElement* TreeScope::getImageMap(const String& url) const
return static_cast<HTMLMapElement*>(m_imageMapsByName.getElementByMapName(AtomicString(name).impl(), this));
}
DOMSelection* TreeScope::getSelection() const
{
if (!rootNode()->document()->frame())
return 0;
if (m_selection)
return m_selection.get();
m_selection = DOMSelection::create(rootNode()->document());
return m_selection.get();
}
Element* TreeScope::findAnchor(const String& name)
{
if (name.isEmpty())
......
......@@ -33,6 +33,7 @@
namespace WebCore {
class ContainerNode;
class DOMSelection;
class Element;
class HTMLMapElement;
class Node;
......@@ -62,6 +63,8 @@ public:
void removeNodeListCache() { ASSERT(m_numNodeListCaches > 0); --m_numNodeListCaches; }
bool hasNodeListCaches() const { return m_numNodeListCaches; }
DOMSelection* getSelection() const;
// Find first anchor with the given name.
// First searches for an element with the given ID, but if that fails, then looks
// for an anchor with the given name. ID matching is always case sensitive, but
......@@ -90,6 +93,8 @@ private:
DocumentOrderedMap m_imageMapsByName;
unsigned m_numNodeListCaches;
mutable RefPtr<DOMSelection> m_selection;
};
inline bool TreeScope::hasElementWithId(AtomicStringImpl* id) const
......
......@@ -58,11 +58,17 @@ static Node* selectionShadowAncestor(Frame* frame)
return shadowAncestor;
}
DOMSelection::DOMSelection(Frame* frame)
: DOMWindowProperty(frame)
DOMSelection::DOMSelection(const TreeScope* treeScope)
: DOMWindowProperty(treeScope->rootNode()->document()->frame())
, m_treeScope(treeScope)
{
}
void DOMSelection::clearTreeScope()
{
m_treeScope = 0;
}
const VisibleSelection& DOMSelection::visibleSelection() const
{
ASSERT(m_frame);
......
/*
* Copyright (C) 2007 Apple Inc. All rights reserved.
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -38,15 +39,18 @@
namespace WebCore {
class Frame;
class Range;
class Node;
class Range;
class TreeScope;
class VisibleSelection;
typedef int ExceptionCode;
class DOMSelection : public RefCounted<DOMSelection>, public DOMWindowProperty {
public:
static PassRefPtr<DOMSelection> create(Frame* frame) { return adoptRef(new DOMSelection(frame)); }
static PassRefPtr<DOMSelection> create(const TreeScope* treeScope) { return adoptRef(new DOMSelection(treeScope)); }
void clearTreeScope();
// Safari Selection Object API
// These methods return the valid equivalents of internal editing positions.
......@@ -88,7 +92,9 @@ namespace WebCore {
void empty();
private:
explicit DOMSelection(Frame*);
const TreeScope* m_treeScope;
explicit DOMSelection(const TreeScope*);
// Convenience method for accessors, does not NULL check m_frame.
const VisibleSelection& visibleSelection() const;
......
......@@ -399,7 +399,6 @@ DOMWindow::~DOMWindow()
#ifndef NDEBUG
if (!m_suspendedForPageCache) {
ASSERT(!m_screen);
ASSERT(!m_selection);
ASSERT(!m_history);
ASSERT(!m_crypto);
ASSERT(!m_locationbar);
......@@ -572,7 +571,6 @@ void DOMWindow::clearDOMWindowProperties()
m_properties.clear();
m_screen = 0;
m_selection = 0;
m_history = 0;
m_crypto = 0;
m_locationbar = 0;
......@@ -886,11 +884,10 @@ void DOMWindow::dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTarg
DOMSelection* DOMWindow::getSelection()
{
if (!isCurrentlyDisplayedInFrame())
if (!isCurrentlyDisplayedInFrame() || !m_frame)
return 0;
if (!m_selection)
m_selection = DOMSelection::create(m_frame);
return m_selection.get();
return m_frame->document()->getSelection();
}
Element* DOMWindow::frameElement() const
......
......@@ -428,7 +428,6 @@ namespace WebCore {
HashSet<DOMWindowProperty*> m_properties;
mutable RefPtr<Screen> m_screen;
mutable RefPtr<DOMSelection> m_selection;
mutable RefPtr<History> m_history;
mutable RefPtr<Crypto> m_crypto;
mutable RefPtr<BarInfo> m_locationbar;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment