Changeset 116608 in webkit


Ignore:
Timestamp:
May 9, 2012 10:31:29 PM (12 years ago)
Author:
creis@chromium.org
Message:

Source/WebCore: Add dispatchMessageEventWithOriginCheck to DOMWindow
https://bugs.webkit.org/show_bug.cgi?id=85815

Reviewed by Adam Barth.

Useful for ports that support cross-process postMessage.
No new tests, since covered by existing postMessage tests.

  • page/DOMWindow.cpp:

(WebCore::DOMWindow::postMessageTimerFired):
(WebCore):
(WebCore::DOMWindow::dispatchMessageEventWithOriginCheck):

  • page/DOMWindow.h:

(WebCore):
(DOMWindow):

Source/WebKit/chromium: Add dispatchMessageEventWithOriginCheck to WebFrame
https://bugs.webkit.org/show_bug.cgi?id=85815

Reviewed by Adam Barth.

Tested by WebFrameTest.DispatchMessageEventWithOriginCheck.
Also fixes source frame bug in willCheckAndDispatchMessageEvent.

  • public/WebFrame.h:

(WebFrame):

  • src/FrameLoaderClientImpl.cpp:

(WebKit::FrameLoaderClientImpl::willCheckAndDispatchMessageEvent):

  • src/WebFrameImpl.cpp:

(WebKit::WebFrameImpl::checkAndDispatchMessageEvent):
(WebKit):

  • src/WebFrameImpl.h:

(WebFrameImpl):

Location:
trunk/Source
Files:
1 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r116601 r116608  
     12012-05-09  Charlie Reis  <creis@chromium.org>
     2
     3        Add dispatchMessageEventWithOriginCheck to DOMWindow
     4        https://bugs.webkit.org/show_bug.cgi?id=85815
     5
     6        Reviewed by Adam Barth.
     7
     8        Useful for ports that support cross-process postMessage.
     9        No new tests, since covered by existing postMessage tests.
     10
     11        * page/DOMWindow.cpp:
     12        (WebCore::DOMWindow::postMessageTimerFired):
     13        (WebCore):
     14        (WebCore::DOMWindow::dispatchMessageEventWithOriginCheck):
     15        * page/DOMWindow.h:
     16        (WebCore):
     17        (DOMWindow):
     18
    1192012-05-09  Jason Liu  <jason.liu@torchmobile.com.cn>
    220
  • trunk/Source/WebCore/page/DOMWindow.cpp

    r116595 r116608  
    867867        return;
    868868
    869     if (timer->targetOrigin()) {
     869    dispatchMessageEventWithOriginCheck(timer->targetOrigin(), event, timer->stackTrace());
     870}
     871
     872void DOMWindow::dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtr<Event> event, PassRefPtr<ScriptCallStack> stackTrace)
     873{
     874    if (intendedTargetOrigin) {
    870875        // Check target origin now since the target document may have changed since the timer was scheduled.
    871         if (!timer->targetOrigin()->isSameSchemeHostPort(document()->securityOrigin())) {
    872             String message = "Unable to post message to " + timer->targetOrigin()->toString() +
     876        if (!intendedTargetOrigin->isSameSchemeHostPort(document()->securityOrigin())) {
     877            String message = "Unable to post message to " + intendedTargetOrigin->toString() +
    873878                             ". Recipient has origin " + document()->securityOrigin()->toString() + ".\n";
    874             console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, message, timer->stackTrace());
     879            console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, message, stackTrace);
    875880            return;
    876881        }
  • trunk/Source/WebCore/page/DOMWindow.h

    r116595 r116608  
    5555    class Location;
    5656    class MediaQueryList;
     57    class MessageEvent;
    5758    class Navigator;
    5859    class Node;
     
    6263    class ScheduledAction;
    6364    class Screen;
     65    class ScriptCallStack;
    6466    class SecurityOrigin;
    6567    class SerializedScriptValue;
     
    234236        void postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort*, const String& targetOrigin, DOMWindow* source, ExceptionCode&);
    235237        void postMessageTimerFired(PassOwnPtr<PostMessageTimer>);
     238        void dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtr<Event>, PassRefPtr<ScriptCallStack>);
    236239
    237240        void scrollBy(int x, int y) const;
  • trunk/Source/WebKit/chromium/ChangeLog

    r116607 r116608  
     12012-05-09  Charlie Reis  <creis@chromium.org>
     2
     3        Add dispatchMessageEventWithOriginCheck to WebFrame
     4        https://bugs.webkit.org/show_bug.cgi?id=85815
     5
     6        Reviewed by Adam Barth.
     7
     8        Tested by WebFrameTest.DispatchMessageEventWithOriginCheck.
     9        Also fixes source frame bug in willCheckAndDispatchMessageEvent.
     10
     11        * public/WebFrame.h:
     12        (WebFrame):
     13        * src/FrameLoaderClientImpl.cpp:
     14        (WebKit::FrameLoaderClientImpl::willCheckAndDispatchMessageEvent):
     15        * src/WebFrameImpl.cpp:
     16        (WebKit::WebFrameImpl::checkAndDispatchMessageEvent):
     17        (WebKit):
     18        * src/WebFrameImpl.h:
     19        (WebFrameImpl):
     20
    1212012-05-09  Hironori Bono  <hbono@chromium.org>
    222
  • trunk/Source/WebKit/chromium/public/WebFrame.h

    r116558 r116608  
    582582                                     WebDOMEventListener*, bool useCapture) = 0;
    583583    virtual bool dispatchEvent(const WebDOMEvent&) = 0;
     584    virtual void dispatchMessageEventWithOriginCheck(
     585        const WebSecurityOrigin& intendedTargetOrigin,
     586        const WebDOMEvent&) = 0;
    584587
    585588
  • trunk/Source/WebKit/chromium/src/FrameLoaderClientImpl.cpp

    r116605 r116608  
    15991599        return false;
    16001600
     1601    WebFrame* source = 0;
     1602    if (event && event->source() && event->source()->document())
     1603        source = WebFrameImpl::fromFrame(event->source()->document()->frame());
    16011604    return m_webFrame->client()->willCheckAndDispatchMessageEvent(
    1602         m_webFrame, WebSecurityOrigin(target), WebDOMMessageEvent(event));
     1605        source, WebSecurityOrigin(target), WebDOMMessageEvent(event));
    16031606}
    16041607
  • trunk/Source/WebKit/chromium/src/WebFrameImpl.cpp

    r116558 r116608  
    123123#include "ResourceRequest.h"
    124124#include "SchemeRegistry.h"
     125#include "ScriptCallStack.h"
    125126#include "ScriptController.h"
    126127#include "ScriptSourceCode.h"
     
    18941895}
    18951896
     1897void WebFrameImpl::dispatchMessageEventWithOriginCheck(const WebSecurityOrigin& intendedTargetOrigin, const WebDOMEvent& event)
     1898{
     1899    ASSERT(!event.isNull());
     1900    // Pass an empty call stack, since we don't have the one from the other process.
     1901    m_frame->domWindow()->dispatchMessageEventWithOriginCheck(intendedTargetOrigin.get(), event, 0);
     1902}
     1903
    18961904WebString WebFrameImpl::contentAsText(size_t maxChars) const
    18971905{
  • trunk/Source/WebKit/chromium/src/WebFrameImpl.h

    r116558 r116608  
    215215                                     WebDOMEventListener*, bool useCapture);
    216216    virtual bool dispatchEvent(const WebDOMEvent&);
     217    virtual void dispatchMessageEventWithOriginCheck(
     218        const WebSecurityOrigin& intendedTargetOrigin,
     219        const WebDOMEvent&);
    217220
    218221    virtual WebString contentAsText(size_t maxChars) const;
  • trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp

    r115206 r116608  
    4141#include "WebScriptSource.h"
    4242#include "WebSearchableFormData.h"
     43#include "WebSecurityOrigin.h"
    4344#include "WebSecurityPolicy.h"
    4445#include "WebSettings.h"
     
    151152    EXPECT_NE(std::string::npos, content.find("Simulated Chromium History Page"));
    152153    EXPECT_EQ(std::string::npos, content.find("Clobbered"));
     154}
     155
     156TEST_F(WebFrameTest, DispatchMessageEventWithOriginCheck)
     157{
     158    registerMockedHttpURLLoad("postmessage_test.html");
     159
     160    // Pass true to enable JavaScript.
     161    WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "postmessage_test.html", true);
     162   
     163    // Send a message with the correct origin.
     164    WebSecurityOrigin correctOrigin(WebSecurityOrigin::create(GURL(m_baseURL)));
     165    WebDOMEvent event = webView->mainFrame()->document().createEvent("MessageEvent");
     166    WebDOMMessageEvent message = event.to<WebDOMMessageEvent>();
     167    WebSerializedScriptValue data(WebSerializedScriptValue::fromString("foo"));
     168    message.initMessageEvent("message", false, false, data, "http://origin.com", 0, "");
     169    webView->mainFrame()->dispatchMessageEventWithOriginCheck(correctOrigin, message);
     170
     171    // Send another message with incorrect origin.
     172    WebSecurityOrigin incorrectOrigin(WebSecurityOrigin::create(GURL(m_chromeURL)));
     173    webView->mainFrame()->dispatchMessageEventWithOriginCheck(incorrectOrigin, message);
     174
     175    // Required to see any updates in contentAsText.
     176    webView->layout();
     177
     178    // Verify that only the first addition is in the body of the page.
     179    std::string content = webView->mainFrame()->contentAsText(1024).utf8();
     180    EXPECT_NE(std::string::npos, content.find("Message 1."));
     181    EXPECT_EQ(std::string::npos, content.find("Message 2."));
    153182}
    154183
Note: See TracChangeset for help on using the changeset viewer.