Changeset 17776 in webkit


Ignore:
Timestamp:
Nov 14, 2006 9:42:44 PM (17 years ago)
Author:
thatcher
Message:

WebCore:

Reviewed by Harrison.

<rdar://problem/4766635> Safari should never follow links in editable areas (add a WebKitEditableLinkNeverLive option)

Adds an EditableLinkNeverLive setting that will make links in editable areas always dead.

  • bridge/mac/WebCoreSettings.mm: (-[WebCoreSettings setEditableLinkBehavior:]):
  • html/HTMLAnchorElement.cpp: (WebCore::HTMLAnchorElement::defaultEventHandler): (WebCore::HTMLAnchorElement::setActive): (WebCore::HTMLAnchorElement::isLiveLink):
  • page/FrameView.cpp: (WebCore::selectCursor):
  • page/Settings.h: (WebCore::Settings::):

WebKit:

Reviewed by Harrison.

<rdar://problem/4766635> Safari should never follow links in editable areas (add a WebKitEditableLinkNeverLive option)

Adds an Open Link, Open Link in New Window and Copy Link to the editing context menu.
Adds a new WebKitEditableLinkNeverLive preference value that maps to WebCore's EditableLinkNeverLive.

  • DefaultDelegates/WebDefaultContextMenuDelegate.m: (-[WebDefaultUIDelegate menuItemWithTag:target:representedObject:]): (-[WebDefaultUIDelegate contextMenuItemsForElement:defaultMenuItems:]): (-[WebDefaultUIDelegate editingContextMenuItemsForElement:defaultMenuItems:]): (-[WebDefaultUIDelegate requestWithURL:includingReferrerFromFrame:]): (-[WebDefaultUIDelegate openNewWindowWithURL:element:]): (-[WebDefaultUIDelegate openLink:]):
  • English.lproj/Localizable.strings:
  • WebKit.exp:
  • WebView/WebPreferences.m: (-[WebPreferences editableLinkBehavior]):
  • WebView/WebPreferencesPrivate.h:
  • WebView/WebUIDelegatePrivate.h:
Location:
trunk
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r17775 r17776  
     12006-11-14  Timothy Hatcher  <timothy@apple.com>
     2
     3        Reviewed by Harrison.
     4
     5        <rdar://problem/4766635> Safari should never follow links in editable areas (add a WebKitEditableLinkNeverLive option)
     6
     7        Adds an EditableLinkNeverLive setting that will make links in editable areas always dead.
     8
     9        * bridge/mac/WebCoreSettings.mm:
     10        (-[WebCoreSettings setEditableLinkBehavior:]):
     11        * html/HTMLAnchorElement.cpp:
     12        (WebCore::HTMLAnchorElement::defaultEventHandler):
     13        (WebCore::HTMLAnchorElement::setActive):
     14        (WebCore::HTMLAnchorElement::isLiveLink):
     15        * page/FrameView.cpp:
     16        (WebCore::selectCursor):
     17        * page/Settings.h:
     18        (WebCore::Settings::):
     19
    1202006-11-14  Mark Rowe  <bdash@webkit.org>
    221
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r17774 r17776  
    1059310593                        isa = PBXProject;
    1059410594                        buildConfigurationList = 149C284308902B11008A9EFC /* Build configuration list for PBXProject "WebCore" */;
     10595                        compatibilityVersion = "Xcode 2.4";
    1059510596                        hasScannedForEncodings = 1;
    1059610597                        knownRegions = (
     
    1060710608                        projectDirPath = "";
    1060810609                        projectRoot = "";
     10610                        shouldCheckCompatibility = 1;
    1060910611                        targets = (
    1061010612                                93F198A508245E59001E9ABC /* WebCore */,
  • trunk/WebCore/bridge/mac/WebCoreSettings.mm

    r17597 r17776  
    339339    if (b != Settings::EditableLinkDefaultBehavior &&
    340340        b != Settings::EditableLinkAlwaysLive &&
     341        b != Settings::EditableLinkNeverLive &&
    341342        b != Settings::EditableLinkOnlyLiveWithShiftKey &&
    342343        b != Settings::EditableLinkLiveWhenNotFocused) {
  • trunk/WebCore/html/HTMLAnchorElement.cpp

    r17770 r17776  
    152152                case Settings::EditableLinkAlwaysLive:
    153153                    break;
    154                    
     154
     155                case Settings::EditableLinkNeverLive:
     156                    HTMLElement::defaultEventHandler(evt);
     157                    return;
     158
    155159                // If the selection prior to clicking on this link resided in the same editable block as this link,
    156160                // and the shift key isn't pressed, we don't want to follow the link
     
    161165                    }
    162166                    break;
    163                
     167
    164168                // Only follow the link if the shift key is down (WinIE/Firefox behavior)
    165169                case Settings::EditableLinkOnlyLiveWithShiftKey:
     
    246250            case Settings::EditableLinkAlwaysLive:
    247251                break;
    248                
     252
     253            case Settings::EditableLinkNeverLive:
     254                return;
     255
    249256            // Don't set the link to be active if the current selection is in the same editable block as
    250257            // this link
     
    475482        case Settings::EditableLinkAlwaysLive:
    476483            return true;
    477            
     484
     485        case Settings::EditableLinkNeverLive:
     486            return false;
     487
    478488        // Don't set the link to be live if the current selection is in the same editable block as
    479489        // this link or if the shift key is down
  • trunk/WebCore/page/EventHandler.cpp

    r17770 r17776  
    558558                        editableLinkEnabled = true;
    559559                        break;
    560                    
     560
     561                    case Settings::EditableLinkNeverLive:
     562                        editableLinkEnabled = false;
     563                        break;
     564
    561565                    case Settings::EditableLinkLiveWhenNotFocused:
    562566                        editableLinkEnabled = nodeIsNotBeingEdited(node, frame) || event.event().shiftKey();
  • trunk/WebCore/page/Settings.h

    r16760 r17776  
    4040        EditableLinkAlwaysLive,
    4141        EditableLinkOnlyLiveWithShiftKey,
    42         EditableLinkLiveWhenNotFocused
     42        EditableLinkLiveWhenNotFocused,
     43        EditableLinkNeverLive
    4344    };
    4445
  • trunk/WebKit/ChangeLog

    r17774 r17776  
     12006-11-14  Timothy Hatcher  <timothy@apple.com>
     2
     3        Reviewed by Harrison.
     4
     5        <rdar://problem/4766635> Safari should never follow links in editable areas (add a WebKitEditableLinkNeverLive option)
     6
     7        Adds an Open Link, Open Link in New Window and Copy Link to the editing context menu.
     8        Adds a new WebKitEditableLinkNeverLive preference value that maps to WebCore's EditableLinkNeverLive.
     9
     10        * DefaultDelegates/WebDefaultContextMenuDelegate.m:
     11        (-[WebDefaultUIDelegate menuItemWithTag:target:representedObject:]):
     12        (-[WebDefaultUIDelegate contextMenuItemsForElement:defaultMenuItems:]):
     13        (-[WebDefaultUIDelegate editingContextMenuItemsForElement:defaultMenuItems:]):
     14        (-[WebDefaultUIDelegate requestWithURL:includingReferrerFromFrame:]):
     15        (-[WebDefaultUIDelegate openNewWindowWithURL:element:]):
     16        (-[WebDefaultUIDelegate openLink:]):
     17        * English.lproj/Localizable.strings:
     18        * WebKit.exp:
     19        * WebView/WebPreferences.m:
     20        (-[WebPreferences editableLinkBehavior]):
     21        * WebView/WebPreferencesPrivate.h:
     22        * WebView/WebUIDelegatePrivate.h:
     23
    1242006-11-14  Anders Carlsson  <acarlsson@apple.com>
    225
  • trunk/WebKit/DefaultDelegates/WebDefaultContextMenuDelegate.m

    r17669 r17776  
    7878   
    7979    switch(tag) {
     80        case WebMenuItemTagOpenLink:
     81            title = UI_STRING("Open Link", "Open Link context menu item");
     82            action = @selector(openLink:);
     83            break;
    8084        case WebMenuItemTagOpenLinkInNewWindow:
    8185            title = UI_STRING("Open Link in New Window", "Open in New Window context menu item");
     
    207211        [menuItems addObject:[self menuItemWithTag:WebMenuItemTagCopyLinkToClipboard target:self representedObject:element]];
    208212    }
    209    
     213
    210214    WebFrame *webFrame = [element objectForKey:WebElementFrameKey];
    211215    NSURL *imageURL = [element objectForKey:WebElementImageURLKey];
     
    294298    }
    295299
     300    NSURL *linkURL = [element objectForKey:WebElementLinkURLKey];
     301   
    296302    if ([[element objectForKey:WebElementIsSelectedKey] boolValue] && !inPasswordField) {
    297303        [menuItems addObject:[self menuItemWithTag:WebMenuItemTagSearchInSpotlight target:nil representedObject:element]];
     
    306312        [menuItems addObject:[NSMenuItem separatorItem]];
    307313    }
    308    
     314
     315    if (linkURL) {
     316        if([WebView _canHandleRequest:[NSURLRequest requestWithURL:linkURL]]) {
     317            [menuItems addObject:[self menuItemWithTag:WebMenuItemTagOpenLink target:self representedObject:element]];
     318            [menuItems addObject:[self menuItemWithTag:WebMenuItemTagOpenLinkInNewWindow target:self representedObject:element]];
     319        }
     320        [menuItems addObject:[self menuItemWithTag:WebMenuItemTagCopyLinkToClipboard target:self representedObject:element]];
     321        // FIXME: we should add "Edit Link..." here like NSTextView has in it's context menu
     322        [menuItems addObject:[NSMenuItem separatorItem]];
     323    }
     324
    309325    // Load our NSTextView-like context menu nib.
    310326    if (defaultMenu == nil) {
     
    370386}
    371387
    372 - (void)openNewWindowWithURL:(NSURL *)URL element:(NSDictionary *)element
    373 {
    374     WebFrame *webFrame = [element objectForKey:WebElementFrameKey];
    375     WebView *webView = [webFrame webView];
    376    
     388- (NSURLRequest *)requestWithURL:(NSURL *)URL includingReferrerFromFrame:(WebFrame *)webFrame
     389{
    377390    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
    378391    NSString *referrer = core(webFrame)->loader()->outgoingReferrer();
    379392    if (referrer)
    380393        [request _web_setHTTPReferrer:referrer];
    381    
    382     [webView _openNewWindowWithRequest:request];
     394    return request;
     395}
     396
     397- (void)openNewWindowWithURL:(NSURL *)URL element:(NSDictionary *)element
     398{
     399    WebFrame *webFrame = [element objectForKey:WebElementFrameKey];
     400    WebView *webView = [webFrame webView];
     401    [webView _openNewWindowWithRequest:[self requestWithURL:URL includingReferrerFromFrame:webFrame]];
    383402}
    384403
     
    388407    WebView *webView = [webFrame webView];
    389408    [webView _downloadURL:URL];
     409}
     410
     411- (void)openLink:(id)sender
     412{
     413    NSDictionary *element = [sender representedObject];
     414    WebFrame *webFrame = [element objectForKey:WebElementFrameKey];
     415    WebFrame *targetFrame = [element objectForKey:WebElementLinkTargetFrameKey];
     416    NSURL *url = [element objectForKey:WebElementLinkURLKey];
     417    if (targetFrame)
     418        [targetFrame loadRequest:[self requestWithURL:url includingReferrerFromFrame:webFrame]];
     419    else
     420        [self openNewWindowWithURL:url element:element];
    390421}
    391422
  • trunk/WebKit/English.lproj/Localizable.strings

    r17305 r17776  
    131131"Open Image in New Window" = "Open Image in New Window";
    132132
     133/* Open Link context menu item */
     134"Open Link" = "Open Link";
     135
    133136/* Open in New Window context menu item */
    134137"Open Link in New Window" = "Open Link in New Window";
  • trunk/WebKit/WebKit.exp

    r16395 r17776  
    4242_WebElementImageURLKey
    4343_WebElementIsSelectedKey
     44_WebElementLinkIsLiveKey
    4445_WebElementLinkLabelKey
    4546_WebElementLinkTargetFrameKey
  • trunk/WebKit/WebView/WebPreferences.m

    r17145 r17776  
    677677    if (value != WebKitEditableLinkDefaultBehavior &&
    678678        value != WebKitEditableLinkAlwaysLive &&
     679        value != WebKitEditableLinkNeverLive &&
    679680        value != WebKitEditableLinkOnlyLiveWithShiftKey &&
    680681        value != WebKitEditableLinkLiveWhenNotFocused) {
  • trunk/WebKit/WebView/WebPreferencesPrivate.h

    r17139 r17776  
    4343#endif
    4444
    45 
     45// WebKitEditableLinkBehavior needs to match the Settings::EditableLinkBehavior enum in WebCore
    4646typedef enum {
    4747    WebKitEditableLinkDefaultBehavior = 0,
    4848    WebKitEditableLinkAlwaysLive,
    4949    WebKitEditableLinkOnlyLiveWithShiftKey,
    50     WebKitEditableLinkLiveWhenNotFocused
     50    WebKitEditableLinkLiveWhenNotFocused,
     51    WebKitEditableLinkNeverLive
    5152} WebKitEditableLinkBehavior;
    5253
  • trunk/WebKit/WebView/WebUIDelegatePrivate.h

    r17023 r17776  
    2929#import <WebKit/WebUIDelegate.h>
    3030
     31// FIXME: This should move to WebUIDelegate.h as part of the WebMenuItemTag enum there, when we're not in API freeze
     32enum {
     33    WebMenuItemTagOpenLink = 1000
     34};
     35
    3136@interface NSObject (WebUIDelegatePrivate)
    3237
Note: See TracChangeset for help on using the changeset viewer.