WebKit Bugzilla
Attachment 341356 Details for
Bug 185958
: NavigationAction does not need to hold initiating DOM Event
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-185958-20180525165213.patch (text/plain), 20.82 KB, created by
Daniel Bates
on 2018-05-25 16:52:14 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Daniel Bates
Created:
2018-05-25 16:52:14 PDT
Size:
20.82 KB
patch
obsolete
>Subversion Revision: 232214 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 1a9071ec904d4ae0bf101427571e751336f6afab..f93495ecef46f6ca98d324eebd04800636c307e7 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,32 @@ >+2018-05-25 Daniel Bates <dabates@apple.com> >+ >+ NavigationAction does not need to hold initiating DOM Event >+ https://bugs.webkit.org/show_bug.cgi?id=185958 >+ <rdar://problem/40531539> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Take a similar approach as was done in <https://bugs.webkit.org/show_bug.cgi?id=185712> >+ and have NavigationAction hold only as many details of the initiating DOM Event as >+ necessary to support WebKit functionality. Retaining a DOM Event effectively retains >+ the document that associated with the event. And DocumentLoader always keeps around >+ the NavigationAction of the last navigation for the "benefit of the various policy handlers". >+ Therefore, having NavigationAction hold only the relevant details of the DOM Event >+ instead of the DOM Event itself we avoid keeping the document we navigated from alive >+ longer than necessary. >+ >+ * dom/MouseRelatedEvent.h: >+ * dom/UIEventWithKeyState.h: >+ * loader/NavigationAction.cpp: >+ (WebCore::NavigationAction::UIEventWithKeyStateData::UIEventWithKeyStateData): Added. >+ (WebCore::NavigationAction::MouseEventData::MouseEventData): Added. >+ (WebCore::keyStateDataForFirstEventWithKeyState): Added. >+ (WebCore::mouseEventDataForFirstMouseEvent): Added. >+ * loader/NavigationAction.h: >+ (WebCore::NavigationAction::keyStateEventData const): Added. >+ (WebCore::NavigationAction::mouseEventData const): Added >+ (WebCore::NavigationAction::event const): Deleted. >+ > 2018-05-25 Daniel Bates <dabates@apple.com> > > NavigationAction should not hold a strong reference to a Document >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 2eeb205a02450ba29324be4b23e69cdf32d92328..9c9848891d15e891ff9f9df278278d0ea5b4932c 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,27 @@ >+2018-05-25 Daniel Bates <dabates@apple.com> >+ >+ NavigationAction does not need to hold initiating DOM Event >+ https://bugs.webkit.org/show_bug.cgi?id=185958 >+ <rdar://problem/40531539> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Write in terms of NavigationAction::{keyStateEventData, mouseEventDataForFirstMouseEvent}(). >+ >+ * WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp: >+ (WebKit::mouseButtonForMouseEventData): >+ (WebKit::syntheticClickTypeForMouseEventData): >+ (WebKit::clickLocationInRootViewCoordinatesForMouseEventData): >+ (WebKit::InjectedBundleNavigationAction::modifiersForNavigationAction): >+ (WebKit::InjectedBundleNavigationAction::mouseButtonForNavigationAction): >+ (WebKit::InjectedBundleNavigationAction::syntheticClickTypeForNavigationAction): >+ (WebKit::InjectedBundleNavigationAction::clickLocationInRootViewCoordinatesForNavigationAction): >+ (WebKit::InjectedBundleNavigationAction::InjectedBundleNavigationAction): >+ (WebKit::mouseEventForNavigationAction): Deleted. >+ (WebKit::mouseButtonForMouseEvent): Deleted. >+ (WebKit::syntheticClickTypeForMouseEvent): Deleted. >+ (WebKit::clickLocationInRootViewCoordinatesForMouseEvent): Deleted. >+ > 2018-05-25 Daniel Bates <dabates@apple.com> > > NavigationAction should not hold a strong reference to a Document >diff --git a/Source/WebKitLegacy/mac/ChangeLog b/Source/WebKitLegacy/mac/ChangeLog >index e01b453ded09bef25bfb77ac51da528cbfc30ed3..a5ce9610e520b52d1ec754589cc002ba8d51f5ad 100644 >--- a/Source/WebKitLegacy/mac/ChangeLog >+++ b/Source/WebKitLegacy/mac/ChangeLog >@@ -1,3 +1,17 @@ >+2018-05-25 Daniel Bates <dabates@apple.com> >+ >+ NavigationAction does not need to hold initiating DOM Event >+ https://bugs.webkit.org/show_bug.cgi?id=185958 >+ <rdar://problem/40531539> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Write in terms of NavigationAction::{keyStateEventData, mouseEventDataForFirstMouseEvent}(). >+ >+ * WebCoreSupport/WebFrameLoaderClient.mm: >+ (WebFrameLoaderClient::actionDictionary const): >+ (findMouseEvent): Deleted. >+ > 2018-05-25 Chris Dumez <cdumez@apple.com> > > Minor ApplicationCacheStorage clean up >diff --git a/Source/WebCore/dom/MouseRelatedEvent.h b/Source/WebCore/dom/MouseRelatedEvent.h >index ad4e5d0c356f541e082e11a26a2d0cc115fd59c7..2e8e27b80fcb1319bc6c0b621dcc3c7ba8c369fd 100644 >--- a/Source/WebCore/dom/MouseRelatedEvent.h >+++ b/Source/WebCore/dom/MouseRelatedEvent.h >@@ -58,7 +58,7 @@ public: > void setIsSimulated(bool value) { m_isSimulated = value; } > int pageX() const final; > int pageY() const final; >- WEBCORE_EXPORT FloatPoint locationInRootViewCoordinates() const; >+ FloatPoint locationInRootViewCoordinates() const; > virtual const LayoutPoint& pageLocation() const; > WEBCORE_EXPORT int x() const; > WEBCORE_EXPORT int y() const; >diff --git a/Source/WebCore/dom/UIEventWithKeyState.h b/Source/WebCore/dom/UIEventWithKeyState.h >index 085a0317ec8dce3a60fe26afa5a162ea2a9a051c..295c15b5217e4f90eb620124284ad2188a4bce7e 100644 >--- a/Source/WebCore/dom/UIEventWithKeyState.h >+++ b/Source/WebCore/dom/UIEventWithKeyState.h >@@ -81,6 +81,6 @@ protected: > bool m_capsLockKey { false }; > }; > >-WEBCORE_EXPORT UIEventWithKeyState* findEventWithKeyState(Event*); >+UIEventWithKeyState* findEventWithKeyState(Event*); > > } // namespace WebCore >diff --git a/Source/WebCore/loader/NavigationAction.cpp b/Source/WebCore/loader/NavigationAction.cpp >index 54ff77fed4e79ec204bd2c668fa76d68086ec09a..0a66bbc4f7bdd7c05c4c32f7da31bf422967cc43 100644 >--- a/Source/WebCore/loader/NavigationAction.cpp >+++ b/Source/WebCore/loader/NavigationAction.cpp >@@ -30,10 +30,10 @@ > #include "NavigationAction.h" > > #include "Document.h" >-#include "Event.h" > #include "FrameLoader.h" > #include "FrameLoaderClient.h" > #include "HistoryItem.h" >+#include "MouseEvent.h" > > namespace WebCore { > >@@ -44,6 +44,25 @@ NavigationAction::Requester::Requester(const Document& document) > { > } > >+NavigationAction::UIEventWithKeyStateData::UIEventWithKeyStateData(const UIEventWithKeyState& uiEvent) >+ : isTrusted { uiEvent.isTrusted() } >+ , shiftKey { uiEvent.shiftKey() } >+ , ctrlKey { uiEvent.ctrlKey() } >+ , altKey { uiEvent.altKey() } >+ , metaKey { uiEvent.metaKey() } >+{ >+} >+ >+NavigationAction::MouseEventData::MouseEventData(const MouseEvent& mouseEvent) >+ : UIEventWithKeyStateData { mouseEvent } >+ , buttonDown { mouseEvent.buttonDown() } >+ , button { mouseEvent.button() } >+ , syntheticClickType { mouseEvent.syntheticClickType() } >+ , absoluteLocation { mouseEvent.absoluteLocation() } >+ , locationInRootViewCoordinates { mouseEvent.locationInRootViewCoordinates() } >+{ >+} >+ > NavigationAction::NavigationAction() = default; > NavigationAction::~NavigationAction() = default; > >@@ -58,13 +77,30 @@ static bool shouldTreatAsSameOriginNavigation(const Document& document, const UR > return url.isBlankURL() || url.protocolIsData() || (url.protocolIsBlob() && document.securityOrigin().canRequest(url)); > } > >+static std::optional<NavigationAction::UIEventWithKeyStateData> keyStateDataForFirstEventWithKeyState(Event* event) >+{ >+ if (UIEventWithKeyState* uiEvent = findEventWithKeyState(event)) >+ return NavigationAction::UIEventWithKeyStateData { *uiEvent }; >+ return std::nullopt; >+} >+ >+static std::optional<NavigationAction::MouseEventData> mouseEventDataForFirstMouseEvent(Event* event) >+{ >+ for (Event* e = event; e; e = e->underlyingEvent()) { >+ if (e->isMouseEvent()) >+ return NavigationAction::MouseEventData { static_cast<const MouseEvent&>(*e) }; >+ } >+ return std::nullopt; >+} >+ > NavigationAction::NavigationAction(Document& requester, const ResourceRequest& resourceRequest, InitiatedByMainFrame initiatedByMainFrame, NavigationType type, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, Event* event, const AtomicString& downloadAttribute) > : m_requester { requester } > , m_resourceRequest { resourceRequest } > , m_type { type } > , m_shouldOpenExternalURLsPolicy { shouldOpenExternalURLsPolicy } > , m_initiatedByMainFrame { initiatedByMainFrame } >- , m_event { event } >+ , m_keyStateEventData { keyStateDataForFirstEventWithKeyState(event) } >+ , m_mouseEventData { mouseEventDataForFirstMouseEvent(event) } > , m_downloadAttribute { downloadAttribute } > , m_treatAsSameOriginNavigation { shouldTreatAsSameOriginNavigation(requester, resourceRequest.url()) } > { >@@ -89,7 +125,8 @@ NavigationAction::NavigationAction(Document& requester, const ResourceRequest& r > , m_type { navigationType(frameLoadType, isFormSubmission, !!event) } > , m_shouldOpenExternalURLsPolicy { shouldOpenExternalURLsPolicy } > , m_initiatedByMainFrame { initiatedByMainFrame } >- , m_event { event } >+ , m_keyStateEventData { keyStateDataForFirstEventWithKeyState(event) } >+ , m_mouseEventData { mouseEventDataForFirstMouseEvent(event) } > , m_downloadAttribute { downloadAttribute } > , m_treatAsSameOriginNavigation { shouldTreatAsSameOriginNavigation(requester, resourceRequest.url()) } > { >diff --git a/Source/WebCore/loader/NavigationAction.h b/Source/WebCore/loader/NavigationAction.h >index 9e868f37ddff02429b36d7a3586b5d9ab3280c7c..a24cf88ae9073cf81c2b03991578fc669446d168 100644 >--- a/Source/WebCore/loader/NavigationAction.h >+++ b/Source/WebCore/loader/NavigationAction.h >@@ -30,6 +30,7 @@ > > #include "BackForwardItemIdentifier.h" > #include "FrameLoaderTypes.h" >+#include "LayoutPoint.h" > #include "ResourceRequest.h" > #include "SecurityOrigin.h" > #include "UserGestureIndicator.h" >@@ -40,6 +41,8 @@ namespace WebCore { > class Document; > class Event; > class HistoryItem; >+class MouseEvent; >+class UIEventWithKeyState; > > class NavigationAction { > public: >@@ -71,6 +74,27 @@ public: > }; > const std::optional<Requester>& requester() const { return m_requester; } > >+ struct UIEventWithKeyStateData { >+ UIEventWithKeyStateData(const UIEventWithKeyState&); >+ >+ bool isTrusted; >+ bool shiftKey; >+ bool ctrlKey; >+ bool altKey; >+ bool metaKey; >+ }; >+ struct MouseEventData : UIEventWithKeyStateData { >+ MouseEventData(const MouseEvent&); >+ >+ bool buttonDown; >+ unsigned short button; >+ unsigned short syntheticClickType; >+ LayoutPoint absoluteLocation; >+ FloatPoint locationInRootViewCoordinates; >+ }; >+ const std::optional<UIEventWithKeyStateData>& keyStateEventData() const { return m_keyStateEventData; } >+ const std::optional<MouseEventData>& mouseEventData() const { return m_mouseEventData; } >+ > NavigationAction copyWithShouldOpenExternalURLsPolicy(ShouldOpenExternalURLsPolicy) const; > > bool isEmpty() const { return !m_requester || m_requester->url().isEmpty() || m_resourceRequest.url().isEmpty(); } >@@ -79,7 +103,6 @@ public: > const ResourceRequest& resourceRequest() const { return m_resourceRequest; } > > NavigationType type() const { return m_type; } >- const Event* event() const { return m_event.get(); } > > bool processingUserGesture() const { return m_userGestureToken ? m_userGestureToken->processingUserGesture() : false; } > RefPtr<UserGestureToken> userGestureToken() const { return m_userGestureToken; } >@@ -106,7 +129,8 @@ private: > NavigationType m_type; > ShouldOpenExternalURLsPolicy m_shouldOpenExternalURLsPolicy; > InitiatedByMainFrame m_initiatedByMainFrame; >- RefPtr<Event> m_event; >+ std::optional<UIEventWithKeyStateData> m_keyStateEventData; >+ std::optional<MouseEventData> m_mouseEventData; > RefPtr<UserGestureToken> m_userGestureToken { UserGestureIndicator::currentUserGesture() }; > AtomicString m_downloadAttribute; > bool m_treatAsSameOriginNavigation; >diff --git a/Source/WebKit/WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp b/Source/WebKit/WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp >index 90b3cde0797abd11c2acf641d2e327b180b72dd6..000471c517622dae236f6bb40ef8f627dfdc6641 100644 >--- a/Source/WebKit/WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp >+++ b/Source/WebKit/WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp >@@ -38,79 +38,57 @@ using namespace WebCore; > > namespace WebKit { > >-static const MouseEvent* mouseEventForNavigationAction(const NavigationAction& navigationAction) >+static WebMouseEvent::Button mouseButtonForMouseEventData(const std::optional<NavigationAction::MouseEventData>& mouseEventData) > { >- for (const Event* e = navigationAction.event(); e; e = e->underlyingEvent()) { >- if (e->isMouseEvent()) >- return static_cast<const MouseEvent*>(e); >- } >- return 0; >+ if (mouseEventData && mouseEventData->buttonDown && mouseEventData->isTrusted) >+ return static_cast<WebMouseEvent::Button>(mouseEventData->button); >+ return WebMouseEvent::NoButton; > } > >-static WebMouseEvent::Button mouseButtonForMouseEvent(const MouseEvent* mouseEvent) >+static WebMouseEvent::SyntheticClickType syntheticClickTypeForMouseEventData(const std::optional<NavigationAction::MouseEventData>& mouseEventData) > { >- if (!mouseEvent) >- return WebMouseEvent::NoButton; >- >- if (!mouseEvent->buttonDown() || !mouseEvent->isTrusted()) >- return WebMouseEvent::NoButton; >- >- return static_cast<WebMouseEvent::Button>(mouseEvent->button()); >+ if (mouseEventData && mouseEventData->buttonDown && mouseEventData->isTrusted) >+ return static_cast<WebMouseEvent::SyntheticClickType>(mouseEventData->syntheticClickType); >+ return WebMouseEvent::NoTap; > } >- >-static WebMouseEvent::SyntheticClickType syntheticClickTypeForMouseEvent(const MouseEvent* mouseEvent) >-{ >- if (!mouseEvent) >- return WebMouseEvent::NoTap; >- >- if (!mouseEvent->buttonDown() || !mouseEvent->isTrusted()) >- return WebMouseEvent::NoTap; > >- return static_cast<WebMouseEvent::SyntheticClickType>(mouseEvent->syntheticClickType()); >-} >- >-static FloatPoint clickLocationInRootViewCoordinatesForMouseEvent(const MouseEvent* mouseEvent) >+static FloatPoint clickLocationInRootViewCoordinatesForMouseEventData(const std::optional<NavigationAction::MouseEventData>& mouseEventData) > { >- if (!mouseEvent) >- return { }; >- >- if (!mouseEvent->buttonDown() || !mouseEvent->isTrusted()) >- return { }; >- >- return mouseEvent->locationInRootViewCoordinates(); >+ if (mouseEventData && mouseEventData->buttonDown && mouseEventData->isTrusted) >+ return mouseEventData->locationInRootViewCoordinates; >+ return { }; > } > > WebEvent::Modifiers InjectedBundleNavigationAction::modifiersForNavigationAction(const NavigationAction& navigationAction) > { > uint32_t modifiers = 0; >- const UIEventWithKeyState* keyStateEvent = findEventWithKeyState(const_cast<Event*>(navigationAction.event())); >- if (keyStateEvent && keyStateEvent->isTrusted()) { >- if (keyStateEvent->shiftKey()) >+ auto keyStateEventData = navigationAction.keyStateEventData(); >+ if (keyStateEventData && keyStateEventData->isTrusted) { >+ if (keyStateEventData->shiftKey) > modifiers |= WebEvent::ShiftKey; >- if (keyStateEvent->ctrlKey()) >+ if (keyStateEventData->ctrlKey) > modifiers |= WebEvent::ControlKey; >- if (keyStateEvent->altKey()) >+ if (keyStateEventData->altKey) > modifiers |= WebEvent::AltKey; >- if (keyStateEvent->metaKey()) >+ if (keyStateEventData->metaKey) > modifiers |= WebEvent::MetaKey; > } >- > return static_cast<WebEvent::Modifiers>(modifiers); > } > > WebMouseEvent::Button InjectedBundleNavigationAction::mouseButtonForNavigationAction(const NavigationAction& navigationAction) > { >- return mouseButtonForMouseEvent(mouseEventForNavigationAction(navigationAction)); >+ return mouseButtonForMouseEventData(navigationAction.mouseEventData()); > } > > WebMouseEvent::SyntheticClickType InjectedBundleNavigationAction::syntheticClickTypeForNavigationAction(const NavigationAction& navigationAction) > { >- return syntheticClickTypeForMouseEvent(mouseEventForNavigationAction(navigationAction)); >+ return syntheticClickTypeForMouseEventData(navigationAction.mouseEventData()); > } > > FloatPoint InjectedBundleNavigationAction::clickLocationInRootViewCoordinatesForNavigationAction(const NavigationAction& navigationAction) > { >- return clickLocationInRootViewCoordinatesForMouseEvent(mouseEventForNavigationAction(navigationAction)); >+ return clickLocationInRootViewCoordinatesForMouseEventData(navigationAction.mouseEventData()); > } > > Ref<InjectedBundleNavigationAction> InjectedBundleNavigationAction::create(WebFrame* frame, const NavigationAction& action, RefPtr<FormState>&& formState) >@@ -126,9 +104,9 @@ InjectedBundleNavigationAction::InjectedBundleNavigationAction(WebFrame* frame, > , m_shouldOpenExternalURLs(navigationAction.shouldOpenExternalURLsPolicy() == ShouldOpenExternalURLsPolicy::ShouldAllow || navigationAction.shouldOpenExternalURLsPolicy() == ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes) > , m_shouldTryAppLinks(navigationAction.shouldOpenExternalURLsPolicy() == ShouldOpenExternalURLsPolicy::ShouldAllow) > { >- if (const MouseEvent* mouseEvent = mouseEventForNavigationAction(navigationAction)) { >- m_hitTestResult = InjectedBundleHitTestResult::create(frame->coreFrame()->eventHandler().hitTestResultAtPoint(mouseEvent->absoluteLocation())); >- m_mouseButton = mouseButtonForMouseEvent(mouseEvent); >+ if (auto mouseEventData = navigationAction.mouseEventData()) { >+ m_hitTestResult = InjectedBundleHitTestResult::create(frame->coreFrame()->eventHandler().hitTestResultAtPoint(mouseEventData->absoluteLocation)); >+ m_mouseButton = mouseButtonForMouseEventData(mouseEventData); > m_syntheticClickType = syntheticClickTypeForNavigationAction(navigationAction); > m_clickLocationInRootViewCoordinates = clickLocationInRootViewCoordinatesForNavigationAction(navigationAction); > } >diff --git a/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm b/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm >index 5e465d7af5326a6c2460fdf89051d29608ff7d7f..bdb883994c4acaa347cfa5d4596e61aca103be1e 100644 >--- a/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm >+++ b/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm >@@ -1555,28 +1555,19 @@ String WebFrameLoaderClient::userAgent(const URL& url) > return [webView _userAgentString]; > } > >-static const MouseEvent* findMouseEvent(const Event* event) >-{ >- for (const Event* e = event; e; e = e->underlyingEvent()) >- if (e->isMouseEvent()) >- return static_cast<const MouseEvent*>(e); >- return 0; >-} >- > NSDictionary *WebFrameLoaderClient::actionDictionary(const NavigationAction& action, FormState* formState) const > { > unsigned modifierFlags = 0; >- const Event* event = action.event(); > #if !PLATFORM(IOS) >- const UIEventWithKeyState* keyStateEvent = findEventWithKeyState(const_cast<Event*>(event)); >- if (keyStateEvent && keyStateEvent->isTrusted()) { >- if (keyStateEvent->ctrlKey()) >+ auto keyStateEventData = action.keyStateEventData(); >+ if (keyStateEventData && keyStateEventData->isTrusted) { >+ if (keyStateEventData->ctrlKey) > modifierFlags |= NSEventModifierFlagControl; >- if (keyStateEvent->altKey()) >+ if (keyStateEventData->altKey) > modifierFlags |= NSEventModifierFlagOption; >- if (keyStateEvent->shiftKey()) >+ if (keyStateEventData->shiftKey) > modifierFlags |= NSEventModifierFlagShift; >- if (keyStateEvent->metaKey()) >+ if (keyStateEventData->metaKey) > modifierFlags |= NSEventModifierFlagCommand; > } > #else >@@ -1592,14 +1583,14 @@ NSDictionary *WebFrameLoaderClient::actionDictionary(const NavigationAction& act > originalURL, WebActionOriginalURLKey, > nil]; > >- if (const MouseEvent* mouseEvent = findMouseEvent(event)) { >+ if (auto mouseEventData = action.mouseEventData()) { > WebElementDictionary *element = [[WebElementDictionary alloc] >- initWithHitTestResult:core(m_webFrame.get())->eventHandler().hitTestResultAtPoint(mouseEvent->absoluteLocation())]; >+ initWithHitTestResult:core(m_webFrame.get())->eventHandler().hitTestResultAtPoint(mouseEventData->absoluteLocation)]; > [result setObject:element forKey:WebActionElementKey]; > [element release]; > >- if (mouseEvent->isTrusted()) >- [result setObject:[NSNumber numberWithInt:mouseEvent->button()] forKey:WebActionButtonKey]; >+ if (mouseEventData->isTrusted) >+ [result setObject:[NSNumber numberWithInt:mouseEventData->button] forKey:WebActionButtonKey]; > else > [result setObject:[NSNumber numberWithInt:WebCore::NoButton] forKey:WebActionButtonKey]; > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
simon.fraser
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 185958
:
341221
| 341356